หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 4 8 2 9 6 8 2

7 ธันวาคม พ.ศ.2549
1286 Users On-Line.
Visitors - Page views
 8 0 6 2 6 0 3
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

โค้ดและแนวคิดการแปลงเลขฐาน 10 เป็นฐาน 2 เรื่องหมูๆ ... ไม่บอกก็แทบจะไม่รู้กันเลย

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 13/2/2552   เวลา: 16:51
(อ่าน : 246422) 
การแปลงเลขฐานเนี่ย มันเป็น Algorithm หรือ วิธีการคิดที่ค่อนข้างน่าสนใจอย่างมากเลยทีเดียว สำหรับคนที่เริ่มต้นหัดเขียนโปรแกรมด้วยภาษาใดๆก็ได้น่ะครับ แม้แต่ผมเองก็ยังเอาไว้ใช้สอนน้องๆที่มาฝึกฝนวิทยายุทธกับผม รวมทั้งเอาไว้เป็นโจทย์ในเวลาที่ผมรับจ้างเป็นคนสัมภาษณ์ เพื่อรับคนเข้าทำงานให้กับบางองค์กร ... จะกรณีไหนๆ แทบจะทั้งนั้น คือ ผมลองให้แปลงเลขฐาน 10 เป็นเลขฐาน 2 ลงกระดาษ ส่วนใหญ่ก็ทำได้อยู่หรอก พอผมถามว่าให้อธิบายถึงแนวความคิดในการออกแบบโปรแกรม คุณจะทำอย่างไร ... อึ้งกันไปล่ะครับคราวนี้ บางคนก็บอกขอทดสอบกับเครื่องได้มั้ย ผมก็ขอย้ำว่า ถามถึงแนวคิดน่ะครับ ไม่ได้ให้เขียนจริงๆ ... แป่ววววว ... แหละนี่คือ Case Study กระบวนการแนวคิด และ แนวทางในการพัฒนาโปรแกรม ... มีของดีก็ต้องรีบๆบอกกันไปล่ะครับ เดี๋ยวพออายุมากขึ้นผมก็จะหันไปเลี้ยงโคดีกว่า ... อืม โคโยตี้ ... น่ะครับพี่น้อง ... 55555+
  • จะเขียนโปรแกรมออกมาได้ ก็ต้องวิเคราะห์ขั้นตอนต่างๆออกมาให้ได้ก่อน ... เรามาเริ่มจากการแปลงเลขฐาน 10 เป็นฐาน 2 ลงบนกระดาษ

      เราใช้วิธีการหารสั้น ที่ร่ำเรียนกันมาสมัยประถมศึกษา ... ตั้งเลขฐาน 10 เดิมไว้ แล้วหารด้วยเลขฐาน 2 ที่ต้องการ
    1. 2 คูณกับอะไรได้ 44 คำตอบคือ 22 จากนั้นเอา 44 - 22 จะเหลือเศษ = 0
    2. 2 คูณกับอะไรได้ 22 คำตอบคือ 11 จากนั้นเอา 22 - 22 จะเหลือเศษ = 0
    3. 2 คูณกับอะไรได้ 11 คำตอบคือ 5 (ผลคือ 10) จากนั้นเอา 11 - 10 จะเหลือเศษ = 1
    4. 2 คูณกับอะไรได้ 5 คำตอบคือ 2 (ผลคือ 4) จากนั้นเอา 5 - 4 จะเหลือเศษ = 1
    5. 2 คูณกับอะไรได้ 2 คำตอบคือ 1 จากนั้นเอา 2 - 2 จะเหลือเศษ = 0
    6. 2 คูณกับอะไรได้ 1 คำตอบคือ 0 จากนั้นเอา 1 - 0 จะเหลือเศษ = 1
    7. เมื่อได้คำตอบสุดท้ายเป็น 0 ... จบกระบวนการ
    8. นั่นคือ ... เมื่อคุณจะเขียนโปรแกรมอะไรขึ้นมาก็ตามที คุณจะต้องเข้าใจในระบบนั้นๆก่อนเสมอ
      วิเคราะห์ระบบ ... มี Input เข้ามาเพื่อทำการประมวลผล (Process) หาผลลัพธ์ Output ออกไป ... จบ
    1. อันดับแรก เราจะเห็นได้ว่าเกิดการหาร 2 แบบ คือ การหารตัดเศษ (DIV) และ การหารเอาเศษ (MOD)
    2. การหารเอาเศษ (MOD) จะออกมาได้เป็นคำตอบ และ จะต้องจัดเรียงลำดับผลลัพธ์ให้ถูกต้อง โดยคำนึงถึงบิตนัยสำคัญต่ำสุด (LSB - Least Significant Bit) ไปหา บิตนัยสำคัญสูงสุด (MSB - Most Significant Bit) ... ก็เช่นเดียวกับฐาน 10 นั่นแหละครับ คือการเรียงลำดับความสำคัญ เช่น ... หลักพัน หลักร้อย หลักสิบ หลักหน่วย ... สำหรับส่วนนี้จะได้ Statement ดังนี้ คือ Bit = (Decimal Mod 2) & Bit (จัดเรียงจากขวาไปซ้าย)
    3. หากสังเกตให้ดีเราจะเห็นได้ว่า ค่าตัวตั้ง ที่ต้องการเปลี่ยนฐานนั้น ผลที่ได้จากการ DIV ในแต่ละครั้ง จะต้องนำกลับมาเป็นตัวตั้งใหม่อีกรอบ นั่นคือ Decimal = Decimal \ 2 ... แหละนี่คือการทำซ้ำ (Repetitive) ... แล้วเราใช้อะไรมาเป็นเงื่อนไข (Condition) ในการทดสอบล่ะ ?????
    4. ทีนี้มาดูไคลแมกซ์ของท้องเรื่อง ... จากที่เราลองทดสอบกับเลขฐาน 10 จำนวนหลายๆค่า จะเห็นได้อย่างชัดเจนเลยว่า ในแต่ละคำตอบของการ DIV นั้นจะสิ้นสุดอยู่ที่ 0 เสมอ ... 55555+ ... แหละนี่คือเงื่อนไขในการทดสอบ แสดงว่าหากคำตอบสุดท้ายไม่ใช่ 0 จะต้องวนรอบการทำงานต่อไป
      ผลพลอยได้ที่ตามมา ... สังเกตได้จากการ MOD - หารเอาเศษ
    1. เมื่อเลขจำนวนเต็ม MOD ด้วย 2 คำตอบได้ 0 คือเลขคู่ และ หากเลขจำนวนเต็ม MOD ด้วย 2 คำตอบได้ 1 นั่นคือเลขคี่ ... 55555+
      คิดแล้วออกแบบ ...
    • จากการคิด และวิเคราะห์ การแปลงเลขฐาน 10 ไปเป็นฐาน 2 นั้น ขั้นตอนต่อไปเราก็แปลงสภาพของมันให้กลายเป็นผังงาน หรือ Flow Chart เพื่อให้ง่ายต่อการเขียนโปรแกรม ผมจะยกตัวอย่างออกมาให้ดูสัก 2 แบบ (ไม่จำเป็นต้องมาทำแบบผมก็ได้น่ะครับ ... ลองคิดเล่นๆดูก่อนแล้วค่อยดูเฉลยเพื่อเปรียบเทียบกัน)

      ผังงานแรกสำหรับคนที่มองเห็นการทำซ้ำ และ เงื่อนไข เป็นหลัก
    • ผังงานที่ 2

      สำหรับคนที่มองการประมวลผลก่อนการทำซ้ำ หรือ เงื่อนไข ... จะแบบไหนก็แล้วแต่ สิ่งสำคัญขอให้ได้คำตอบที่ถูกต้องออกมาก็พอแล้วครับ ... สำหรับน้องๆที่กำลังจะจบการศึกษา และออกไปต่อสู้กับโลกแห่งความเป็นจริงภายนอก ... พึงระลึกเสมอครับเวลาที่นายจ้างป้อนงานให้คุณทำ (Input) เพื่อให้คุณหาคำตอบ (Output) ให้กับหน่วยงานที่คุณสังกัด ผมบอกได้เลยว่าไม่มีใครเขาจะมาสนใจ Process จากคุณนักหรอกครับ ... พี่น้อง ... เพราะเขาต้องการคำตอบ ไม่ได้ต้องการข้ออ้าง หรือ คำแก้ตัวใดๆ
    ข้อมูลเพิ่มเติม
    วิธีการคิดกับตัวเลขจำนวนเต็ม
    การแปลงเลขฐาน 16 เป็นเลขฐาน 2 และ เลขฐาน 10 - VB6
    การแปลงเลขฐาน 10 เป็นเลขฐาน 16 และ เลขฐาน 2 เป็นเลขฐาน 16 (แนวคิดของช่าง)
    เรื่องของโปรแกรมย่อย (อีกที) ... Sub Program, Routine, Procedure หรือ Function
    ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข และ จุดทศนิยมเท่านั้น (VB6)
    ตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับค่าเฉพาะตัวเลข (VB.Net)
    การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 1
    การเข้ารหัส และ ถอดรหัส ด้วยตรรกศาสตร์ XOR (eXclusive OR) - ภาค 2
    มาดูโค้ดกันเถอะ ...
    
    Private Sub Form_Load()
        Text1.Text = Decimal2Binary(9)
    End Sub
    
    ' ตัวแปร Dec จะเป็นตัวแปรที่รับค่าในการเรียกใช้งานฟังค์ชั่น
    ' และส่งค่าคืนกลับเป็นแบบ String
    Function Decimal2Binary(Dec As Integer) As String
        ' เก็บค่าคำตอบของการหารเอาเศษ (MOD)
        ' อันนี้แล้วไม่จำเป็นต้องใช้ก็ได้ ให้เอาชื่อฟังค์ชั่นตัวมันเองมาเก็บเป็นคำตอบแทนน่ะครับ
        Dim Bit As String
        
        ' DO WHILE ... เงื่อนไขเป็นจริงจะวนรอบ ... เท็จเมื่อไหร่ก็จะออกจากลูป
        Do While (Dec > 0)
            Bit = (Dec Mod 2) & Bit
            Dec = Dec \ 2
        Loop
        
        ' คืนค่ากลับไป (Return)
        Decimal2Binary = Bit
    End Function
    

    เป็นอย่างไรบ้างครับพี่น้อง หลังจากที่เราเขียนผังงานเอาไว้ แล้วพอมาลงโค้ดมันก็ ... ง่ายๆ หมูๆ จริงหรือเปล่าล่ะครับ ... บ่อยครั้งที่วิเคราะห์และออกแบบโปรแกรม จะใช้เวลามากกว่าการเขียนโปรแกรมด้วยซ้ำไป แต่ในโลกโปรแกรมมิ่งของระดับ Amateur หรือ ระดับใหม่ๆ สมัครเล่นนั้นมันไม่ได้ง่ายดายอย่างนี้หรอก เพราะกว่าจะแกะออกมาได้ก็ งงน่ะจังงัง ... จนตาจะหลับให้ได้อย่างเดียว เช่น
    ตัวอย่างของการใช้เงื่อนไขผิด

    Do While (Dec >= 0)

    ผลที่ได้ คือ ในขณะที่ Dec มากกว่า หรือ เท่ากับ 0 ... ทำให้เกิด Dead Lock หรือ ออกจากลูปไม่ได้ ... ไงล่ะครับ เพราะค่าสุดท้ายของการ DIV ทำยังไงๆมันก็จะได้ 0 เสมอ ... แล้วมันจะหารูไหนออกมาล่ะทีนี้ เหอๆๆๆๆ ... ดังนั้นจะใช้ หรือ เท่ากับ ไม่ได้โดยเด็ดขาด
    ตัวอย่างของการเกิด Error
      การเกิด Error หรืือ ความผิดพลาดจะมีอยู่ 3 แบบ คือ
    1. Syntax Error : มาจากการป้อนคำสั่ง ไวยกรณ์ (Syntax) ผิดพลาด Error แบบนี้แก้ไขง่าย เพราะใน VB6 จะชี้ตำแหน่งที่ผิดให้เห็นได้ทันที
    2. Run Time Error : ข้อผิดพลาดเกิดขึ้นในระหว่างที่โปรแกรมกำลังทำงานอยู่ เช่น เกิดการกระทำใดๆ (Operator) ที่มีชนิดของข้อมูลไม่ตรงกัน เช่น เอา 1 + "A" เป็นต้น การหาทางแก้ไขความผิดพลาดแบบนี้จะเริ่มยากขึ้น เพราะเราต้องตีความหมายของแต่ละ Error นั้นๆด้วย
    3. Logical Error : ความผิดพลาดนี้เกิดจากการประมวลผลลัพธ์ที่ได้ออกมานั้น ไม่ตรงกับที่เราต้องการ Error แบบนี้จะแก้ไขได้ยากมาก ... การป้องกันที่จะไม่ให้เกิด Error นี้มีเพียงทางเดียว ... ออกแบบโปรแกรมให้รอบคอบ รัดกุมที่สุด และทดสอบให้ดีก่อนที่จะลงมือเขียนคำสั่งเข้าไป
    
        Do While (Dec > 0)
            ' ลองสลับ Statement ดู
            Dec = Dec \ 2
            Bit = (Dec Mod 2) & Bit
        Loop
    


    ลองใช้ DO UNTIL ...
    
        ' เงื่อนไขเป็นเท็จจะทำการวนรอบ หากเป็นจริงจะต้องออกจากลูป
        Do Until (Dec = 0)
            Bit = (Dec Mod 2) & Bit
            Dec = Dec \ 2
        Loop
    
    จะเห็นได้ว่า Statement ในการทำงาน หรือ การแปลงเลขฐาน 10 เป็นเลขฐาน 2 นั้นไม่ได้เปลี่ยนไปเลย จะเปลี่ยนก็แค่เฉพาะเงื่อนไขที่ใช้ในการทดสอบเท่านั้นเองครับ
    เตรียมความพร้อมสำหรับการแปลงเลขฐาน 2 เป็นฐาน 16 ...
      การแปลงเลขฐาน 2 เป็นฐาน 16 จะอาศัยการนับจำนวนบิตคราวละ 4 บิต (คล้ายกับ BCD - Binary Code Decimal หรือที่มักเรียกว่ารหัส 8421) ดังนี้คือ
    1. 0 0 0 0 = 0
    2. 0 0 0 1 = 1
    3. 0 0 1 0 = 2
    4. 0 0 1 1 = 3
    5. 0 1 0 0 = 4
    6. .................
    7. 1 0 0 1 = 9
    8. 1 0 1 0 = A
    9. 1 0 1 1 = B
    10. 1 1 0 0 = C
    11. 1 1 0 1 = D
    12. 1 1 1 0 = E
    13. 1 1 1 1 = F
    ในกรณีของการติดต่อกับฮาร์ดแวร์ เรามักจะใช้เลขฐาน 2 กับ คู่กับเลขฐาน 16 อยู่เสมอ แน่นอนว่าจำนวนบิตนั้นจะต้องถูกกำหนดไว้ค่อนข้างจะตายตัว เช่น 8, 16 หรือ 32 บิต เป็นต้น จากตัวอย่างด้านบนหากเราจะนำไปใช้แปลงเลขฐาน 2 ไปเป็นฐาน 16 ก็จะเกิดปัญหาขึ้นได้ เนื่องจากจำนวนบิตอาจจะไม่ครบ เราจึงต้องแก้ปัญหาด้วยการกำหนดจำนวนบิตลงไปให้แน่นอน ... มาลองดูตัวอย่างกันครับ
    
    Private Sub Form_Load()
        ' การแปลงเลขฐาน 10 (ค่า 127) ให้มีขนาดจำนวน 16 บิต
        Text1.Text = Decimal2BinaryFix(127, 16)
    End Sub
    
    ' Optional หมายถึง หากไม่ส่งค่าใดๆมาฟังค์ชั่น ให้ยึดค่าที่กำหนดไว้ หรือ 8 เป็นค่าเริ่มต้นเสมอ
    Function Decimal2BinaryFix(Dec As Integer, Optional NumBit As Byte = 8)
        ' เก็บค่าคำตอบของการหารเอาเศษ (MOD)
        ' อันนี้แล้วไม่จำเป็นต้องใช้ก็ได้ ให้เอาชื่อฟังค์ชั่นตัวมันเองมาเก็บเป็นคำตอบแทนน่ะครับ
        Dim Bit As String
        
        Dim i As Byte   ' นับจำนวนบิต ... BYTE มีค่าเท่ากับ 0 - 255 น่ะครับ ... พี่น้อง
        
        ' ==============================================================
        ' FOR ... NEXT
        ' เนื่องจากลูป For อาศัยการการนับเป็นเงื่อนไข มีค่าเริ่มต้น - สิ้นสุด และ Step ในการนับ
        ' ดังนั้นเราสามารถกำหนดจำนวนบิตที่ต้องการ เพื่อนำมาทำเป็นเงื่อนไขได้โดยตรง
        For i = 1 To NumBit
            Bit = (Dec Mod 2) & Bit
            Dec = Dec \ 2
        Next
        ' คำตอบที่ส่งกลับไปสำหรับคำสั่งวนรอบด้วย FOR ... อาศัยจำนวนบิตเป็นเงื่อนไข (NumBit) แทน
        Decimal2BinaryFix = Bit
    End Function
    
    แม้ว่ามันจะเกิดการแปลงเลขฐานเสร็จไปเรียบร้อยแล้ว แต่ลูป Forจะยังคงทำงานต่อไปอย่างต่อเนื่องจนกว่าจะนับจำนวนบิตครบหมด (i นับได้เท่ากับ NumBit) หลังจากนั้นเราก็สามารถจะนำไปใช้ในการแปลงจากเลขฐาน 2 ไปเป็นฐาน 16 ได้อย่างไม่ยากเย็นนักเลยครับ ... พี่น้อง (แบะๆ ... ไว้ให้ก่อน ใช้ For และ Select Case ต่อได้เลย)
    Conclusion:
    นี่แค่โจทย์เรื่องๆเดียวน่ะครับ และมีคำสั่งเพียงไม่กี่บรรทัดเอง แต่ทว่ามันกลับซุกซ่อนสิ่งที่เรียกว่า "ความรู้" เอาไว้หลายอย่างเลยทีเดียว เริ่มจากการวิเคราะห์ระบบ (Analysis) การเขียนผังงาน (FlowChart) การทำซ้ำ (Repetitive) การตัดสินใจ (Decision) โดยอาศัยเงื่อนไข (Condition) การทำโปรแกรมย่อย (Function) เรื่องของการเกิดข้อผิดพลาด (Run Time กับ Logical Error) และ อื่นๆอีก ... ลองพยายามหาโจทย์ที่อยู่ใกล้ๆกับตัวเรานั่นแหละครับเอามาฝึกคิด และ ฝึกทำ

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: [email protected] หรือ โทร. 08-6862-6560