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

หรือติดต่อเข้ามาทาง 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
 5 5 9 1 7 4 2

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

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

การแปลงเลขฐาน 16 เป็นเลขฐาน 2 และ เลขฐาน 10 - VB6

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 14/7/2553   เวลา: 09:29
(อ่าน : 75256) 
คำว่า บิต คือ หน่วยที่เล็กที่สุดของคอมพิวเตอร์ หากมีขนาด 8 บิต ก็เท่ากับ 1 ไบต์ อันนี้ก็คงท่องเพื่อสอบกันมาได้แล้วแหละครับ ... สิ่งที่เราศึกษาเรื่องพวกนี้เอาไว้ ไม่ใช่เฉพาะการนำมาเขียนเป็นโปรแกรมแปลงเลขฐานได้เท่านั้น เพราะการเขียนโปรแกรมเราก็ต้องประกาศชนิดของตัวแปร เช่น Integer มีขนาด 2 ไบต์ (หรือ 16 บิต) แบบ Long Integer มีขนาด 4 ไบต์ (หรือ 32 บิต) ทีนี้จะมีใครรู้บ้างว่าที่เรียกกันเป็นบิต เป็นไบต์นั้น มันเอามาใช้กับอะไรได้บ้าง อันนี้ผมเคยอธิบายไปแล้ว คลิ๊กเข้ามาอ่านได้ที่นี่ ... ซึ่งหากเราสามารถทำความเข้าใจในเรื่องพวกนี้ได้ ก็จะทำให้เลือกชนิด และ ขนาดของตัวแปรมาใช้งานได้อย่างเหมาะสม ... ทีนี้มาว่ากันถึงเรื่องการแปลงเลขฐาน ... เอาตั้งแต่ Basic เพื่อให้กระจ่างกันไปเลย ... 55555+
    อธิบายเรื่องของการกระจายเลขฐาน 10
  • ค่าเลขฐาน 10 = ... + (10^3 x Dec) + (10^2 x Dec) + (10^1 x Dec) + (10^0 x Dec)
  • (เครื่องหมาย ^ คือ การยกกำลังน่ะครับ)
  • พวก 10 ยกกำลังค่าต่างๆนั้น เราเรียกว่าน้ำหนักประจำหลัก (Weight) น่ะครับ
  • Dec = ค่าประจำหลักใดๆ
  • เช่น 4327 ก็คือ ...
  • = (10^3 x 4) + (10^2 x 3) + (10^1 x 2) + (10^0 x 7)
  • = (1000 x 4) + (100 x 3) + (10 x 2) + (1 x 7)
  • = 4000 + 300 + 20 + 7 = 4327
    ดังนั้นการคิดเลขฐาน 2 ก็ใช้หลักการเดียวกัน แต่เปลี่ยนจาก 10 ที่ยกกำลัง ให้กลายเป็น 2 ยกกำลังแทน
  • เพราะนั่นคือเลขฐานที่เราต้องการ (ฐาน 2) คำนวณหาเลขฐาน 10
  • สูตรสมการในการแปลงเลขฐาน 2 เป็นเลขฐาน 10
  • Decimal หรือ เลขฐาน 10 = ... + (2^3 x Bit) + (2^2 x Bit) + (2^1 x Bit) + (2^0 x Bit)
  • พวก 2 ยกกำลังค่าต่างๆนั้น เราเรียกว่าน้ำหนักประจำหลัก (Weight) หรือ ประจำบิต
  • เมื่อ Bit มีค่าเป็น 0 หรือ 1 (กรณีเป็น 0 ให้ข้ามไปเลย เพราะ 0 คูณอะไรก็ได้ 0)
  • เช่น ... 1 0 1 1 เลขฐาน 2 ...
  • = (2^3 x 1) + (2^2 x 0) + (2^1 x 1) + (2^0 x 1)
  • = (8 x 1) + (4 x 0) + (2 x 1) + (1 x 1)
  • = 8 + 0 + 2 + 1 = 11 (ฐาน 10)
    การคิดเลขฐาน 16 ก็ใช้หลักการเดียวกัน คือ เปลี่ยนจาก 10 ที่ยกกำลัง ให้กลายเป็น 16 ยกกำลังแทน
  • เพราะนั่นคือเลขฐานที่เราต้องการ (ฐาน 16) คำนวณหาเลขฐาน 10
  • สูตรสมการในการแปลงเลขฐาน 16 เป็นเลขฐาน 10
  • Decimal หรือ เลขฐาน 10 = ... + (16^3 x Hex) + (16^2 x Hex) + (16^1 x Hex) + (16^0 x Hex)
  • เมื่อ Hex คือ ค่าของเลขฐาน 16 ในแต่ละหลัก แต่ต้องคิดเป็นเลขฐาน 10 ก่อน เช่น
  • 0 - 9 มีค่าเท่ากับฐาน 10 อยู่แล้ว ไม่ต้องแปลงค่าใดๆ แต่ A=10, B=11,C=12,D=13,E=14,F=15
  • เช่น 2EF ...
  • = (16^2 x 2) + (16^1 x 14) + (16^0 x 15)
  • = (256 x 2) + (16 x 14) + (1 x 15)
  • = 512 + 224 + 15 = 751 (ฐาน 10)
  • ตัว 2 E หรือ F (ฐาน 16) แต่ละตัวมีขนาด 4 บิตเท่านั้นน่ะครับ

สังเกตว่า การคำนวณหาค่าน้ำหนัก (Weight) ประจำหลัก จะอาศัยเลขฐานนั้นๆ ยกกำลังตั้งแต่ 0 (ทางขวามือสุด) แล้วเพิ่มค่าเลขยกกำลังไปทางซ้ายมือขึ้นไปครั้งละ 1 ไปเรื่อยๆ จนกว่าจะสิ้นสุดหลักทางซ้ายมือ ... (เพราะนี่แหละคือหลักการที่เราต้องนำเอาไปเขียนเป็นโปรแกรม)

จะเห็นได้ชัดเจนจากเลขทั้ง 3 ฐานเลยว่า หลักการที่นำมาใช้ (หรือสมการมันนั่นแหละ) ในการแปลงเลขฐานใดๆไปเป็นเลขฐาน 10 มันไม่ได้เปลี่ยนไปเลย สิ่งที่เปลี่ยน คือ เลขฐานที่ใช้ยกกำลัง เพื่อหาค่าน้ำหนัก (Weight) ประจำหลัก และจะยกเว้นเลขฐาน 16 เพราะเนื่องจากว่าตั้งแต่ค่า 10 - 15 ตัวเลขมันมีขนาด 2 หลัก จึงไม่สะดวกต่อการนำมาใช้งาน ทางผู้คิดระบบเลขฐาน จึงได้นำค่า A - F มาแทนค่าที่ว่าดังกล่าว ดังนั้นก่อนที่จะแปลงเลขฐาน 16 ไปเป็นเลขฐาน 10 จะต้องมีการตรวจสอบเสียก่อนว่าหลักนั้นๆ มีค่า A - F อยู่หรือไม่ ... หากมีต้องแปลงค่าให้ไปอยู่ในเลขฐาน 10 ตามจำนวนของมันเองก่อน (พิจารณาจากตารางข้างล่างประกอบ)

การแปลงเลขฐาน 16 เป็นเลขฐาน 10 จะมีวิธีการหลักๆอยู่ 2 แบบ คือ
  • แปลงจากฐาน 16 ไปเป็นฐาน 10 ตรงๆไปเลย โดยใช้สมการทางด้านบน
  • แปลงเลขฐาน 16 เป็นเลขฐาน 2 ก่อน แล้วค่อยแปลงเลขฐาน 2 ไปเป็นเลขฐาน 10 อีกที
ซึ่งผมจะแสดงวิธีการ และ แจกโค้ดไปให้ดูทั้ง 2 แบบนั่นแหละครับ ... แต่ถ้าหากอ่านมาถึงตรงนี้แล้วยังไม่เข้าใจ ผมแนะนำไปศึกษาเรื่องของเลขฐาน 10 ก่อนน่าจะดีกว่าน่ะครับ

HEXADECIMAL
(เลขฐาน 16 แต่ละตัวจะมี Binary ขนาด 4 บิต)

DECIMAL
(ค่าในเลขฐาน 10)

FOUR DIGIT BINARY
(น้ำหนักประจำหลักของแต่ละบิต)
บิต 3 บิต 2 บิต 1 บิต 0

2^3 = 8

2^2 = 4

2^1 = 2

2^0 = 1

0

0

0

0

0

0

1

1

0

0

0

1

2

2

0

0

1

0

3

3

0

0

1

1

4

4

0

1

0

0

5

5

0

1

0

1

6

6

0

1

1

0

7

7

0

1

1

1

8

8

1

0

0

0

9

9

1

0

0

1

A

10

1

0

1

0

B

11

1

0

1

1

C

12

1

1

0

0

D

13

1

1

0

1

E

14

1

1

1

0

F

15

1

1

1

1

ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
ข้อมูลเพิ่มเติม
วิธีการคิดกับตัวเลขจำนวนเต็ม
การแปลงเลขฐาน 10 เป็นเลขฐาน 16 และ เลขฐาน 2 เป็นเลขฐาน 16 (แนวคิดของช่าง)
โค้ดและแนวคิดการแปลงเลขฐาน 10 เป็นฐาน 2 เรื่องหมูๆ ... ไม่บอกก็แทบจะไม่รู้กันเลย
ฟังค์ชั่น หรือ โปรแกรมย่อยในการแปลงเลขฐาน 16 เป็นฐาน 10 โดยตรง ด้วยการใช้สมการ

' #######################################################
' ฟังค์ชั่นการแปลงเลขฐาน 16 เป็นเลขฐาน 10 โดยใช้สมการ
' โดยที่มีการรับค่าชุดเลขฐาน 16 เข้ามา (String) แล้วคืนค่ากลับเลขฐาน 10 กลับไป
' #######################################################
Function HexToDecimal(Hex As String) As Double
    Dim i As Integer
    ' เก็บค่าเลขฐาน 10 เป็นตัวแปรแบบ Double มีขนาด 8 ไบต์
    ' หากกำหนดแบบ Long จะได้ค่าเลขฐาน 10 ไม่เกิน 2,147,483,647 ค่า
    Dim Dec As Double
    
    ' ตรวจสอบว่าหลักนั้นมีค่า A - F หรือไม่ หากใช่ต้องเปลี่ยนเป็นเลขฐาน 10 ก่อน
    ' เช่น A = 10, B = 11, C = 12 , ... F = 15
    Dim Hex2Dec As Byte
    
    ' ตัวแปรกำหนดค่าเลขยกกำลังของแต่ละหลัก จาก 0, 1, 2, 3 ... ไปเรื่อยๆจนครบจำนวนหลักฐาน 16
    Dim HexWeight As Byte
    
    ' เริ่มต้นให้เป็น 0 เพราะต้องให้ 16 ยกกำลัง 0 และ เพิ่มขึ้นทีละ 1 จนกว่าจะครบจำนวนจำนวนหลัก
    HexWeight = 0
    
    ' เป็นการคำนวณหาจากหลักขวามือสุด ไปทางหลักซ้ายมือสุด
    ' ลดค่าความยาวของเลขฐาน 16 ลงครั้งละ 1 หลัก
    ' โดยปกติเรามักจะถนัดอ่านจากซ้ายไปขวา ทำให้เขียนโปรแกรมได้ง่ายขึ้น ... พอเจอแบบนี้อาจงงกัน
    ' ยกตัวอย่างเช่น A3F (มีความยาว = 3) ... ต้องลองทำการ Debug Program ดูด้วยน่ะครับ
    ' รอบแรก i จะอ่านค่าเริ่มต้นได้ 3 นั่นคือคำสั่ง Mid$(Hex, 3, 1) ก็อ่านค่าได้หลักที่ 3 (1 ตัว) คือ F
    ' รอบที่สอง i จะถูกลดค่าลง 1 (เหลือ 2) นั่นคือคำสั่ง Mid$(Hex, 2, 1) ก็จะอ่านค่าในหลักที่ 2 (1 ตัว) คือ 3
    ' รอบที่สาม i จะถูกลดค่าลง 1 (เหลือ 1) นั่นคือคำสั่ง Mid$(Hex, 1, 1) ก็จะอ่านค่าในหลักที่ 1 (1 ตัว) คือ A
    For i = Len(Hex) To 1 Step -1
    
        ' ทดสอบหาค่าตัวอักษร A - F ที่แทนเลขฐาน 10 ระหว่าง 10 - 15 ก่อน
        Select Case Mid$(Hex, i, 1)
            Case "A"
                Hex2Dec = 10
            Case "B"
                Hex2Dec = 11
            Case "C"
                Hex2Dec = 12
            Case "D"
                Hex2Dec = 13
            Case "E"
                Hex2Dec = 14
            Case "F"
                Hex2Dec = 15
            Case Else
            
                ' หากเป็นค่า 0 - 9 ก็ใช้ค่าของตัวมันเองไปเลย (เพราะเท่ากับ ฐาน 10 อยู่แล้ว)
                Hex2Dec = Mid$(Hex, i, 1)
                
        End Select
        
        ' ตรวจสอบว่าหลักนั้นเป็น 0 หรือไม่ หากใช่ให้ข้ามไปเลย เพราะ 0 คูณกับอะไรก็ได้ 0 เสมอ
        If Hex2Dec <> 0 Then Dec = Dec + ((16 ^ HexWeight) * Hex2Dec)
        
        ' เพิ่มค่าเลขยกกำลังขึ้นอีก 1
        HexWeight = HexWeight + 1
        
    Next
    
    ' ส่งค่ากลับผ่านชื่อฟังค์ชั่นตัวมันเอง
    HexToDecimal = Dec

End Function

' #######################################################
' การเรียกใช้งาน
' #######################################################
Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2

    ' เรียกใช้ฟังค์ชั่นโดยการคำนวณหาค่าเลขฐาน 10 จากสมการโดยตรง
    MsgBox HexToDecimal("FED0")
    
End Sub


Run Time

การแปลงเลขฐาน 16 เป็นเลขฐาน 2 ก่อน จากฐาน 2 ให้กลายเป็นฐาน 10

Private Sub cmdConvert_Click()
    Dim i As Integer
    
    txtBinary.Text = ""
    txtDecimal.Text = ""
    
    If Trim$(txtHexadecimal.Text) = "" Or Len(Trim$(txtHexadecimal.Text)) = 0 Then Exit Sub
    
    ' #######################################################
    ' การแปลงเลขฐาน 16 (HexaDecimal) ให้กลายเป็นเลขฐาน 2 (Binary)
    ' #######################################################
    
    ' การเปรียบเทียบค่าเลขฐาน 16 ทีละหลัก นับจากทางขวามือสุดไปทางซ้ายมือสุด
    ' แล้วนับถอยหลังไปทีละ 1 หลัก (Step - 1)
    ' อาศัยหลักการง่ายๆ คือ เปรียบเทียบค่าของเลขฐาน 16 ทีละหลัก (ขวาไปซ้าย)
    ' เพราะแต่หลักของเลขฐาน 16 จะแทนเลขฐาน 2 ได้ขนาด 4 บิต
    For i = Len(txtHexadecimal.Text) To 1 Step -1
        Select Case Mid$(txtHexadecimal, i, 1)
            Case "0"
                txtBinary.Text = "0000" & txtBinary.Text
            Case "1"
                txtBinary.Text = "0001" & txtBinary.Text
            Case "2"
                txtBinary.Text = "0010" & txtBinary.Text
            Case "3"
                txtBinary.Text = "0011" & txtBinary.Text
            Case "4"
                txtBinary.Text = "0100" & txtBinary.Text
            Case "5"
                txtBinary.Text = "0101" & txtBinary.Text
            Case "6"
                txtBinary.Text = "0110" & txtBinary.Text
            Case "7"
                txtBinary.Text = "0111" & txtBinary.Text
            Case "8"
                txtBinary.Text = "1000" & txtBinary.Text
            Case "9"
                txtBinary.Text = "1001" & txtBinary.Text
            Case "A"
                txtBinary.Text = "1010" & txtBinary.Text
            Case "B"
                txtBinary.Text = "1011" & txtBinary.Text
            Case "C"
                txtBinary.Text = "1100" & txtBinary.Text
            Case "D"
                txtBinary.Text = "1101" & txtBinary.Text
            Case "E"
                txtBinary.Text = "1110" & txtBinary.Text
            Case "F"
                txtBinary.Text = "1111" & txtBinary.Text
        End Select
    Next
    
    ' #######################################################
    ' การแปลงเลขฐาน 2 (Binary) ให้กลายเป็นเลขฐาน 10 (Decimal)
    ' #######################################################
    ' เก็บค่าเลขฐาน 10 เป็นตัวแปรแบบ Double มีขนาด 8 ไบต์
    ' หากกำหนดแบบ Long จะได้ค่าเลขฐาน 10 ไม่เกิน 2,147,483,647 ค่า ...
    ' หากเราป้อนค่าฐาน 16 = FFFFFFFF จะทำให้เกิด Overflow (มีค่าเกินที่ตัวแปรจะรับได้)
    Dim Dec As Double
    
    ' ตัวแปรกำหนดค่าเลขยกกำลังของบิตแต่ละหลัก จาก 0, 1, 2, 3 ... ไปเรื่อยๆจนครบจำนวนบิต
    Dim BitWeight As Integer
    ' เริ่มต้นให้เป็น 0 เพราะต้องให้ 2 ยกกำลัง 0 และ เพิ่มขึ้นทีละ 1 จนกว่าจะครบจำนวนบิต
    'BitWeight = 0
    
    ' เป็นการคำนวณหาจากบิตขวามือสุด (LSB - Least Significant Bit หรือ บิตนัยสำคัญต่ำสุด)
    ' ไปทางบิตซ้ายมือสุด (MSB - Most Significant Bit หรือ บิตนัยสำคัญสูงสุด)
    ' ลดค่าความยาวจากทางขวาของเลข Binary มาทางซ้ายลงครั้งละ 1
    For i = Len(txtBinary.Text) To 1 Step -1
        ' หาน้ำหนักประจำหลักจากบิตขวามือสุด (LSB) ไปยังบิตซ้ายมือสุด (MSB)
        ' โดยการให้ 2 ยกกำลังตั้งแต่ 0 และ เพิ่มค่าขึ้น 1 ไปเรื่อยๆ จนกว่าจะครบจำนวนบิต
        ' จากนั้นคูณเข้ากับค่าบิต นั่นคือ ค่า 0 หรือ 1 เท่านั้น แล้วรวมค่าแต่ละบิตที่ได้ทั้งหมด
        ' เช่น 1011 ก็จะได้ (2^3 x 1) + (2^2 x 0) + (2^1 x 1) + (2^0 x 1)
        
        ' แบบนี้เป็นการคำนวณหาหมดทุกๆบิต
        ' Dec = Dec + ((2 ^ BitWeight) * Mid$(txtBinary.Text, i, 1))
        
        ' หรือ ตรวจสอบว่าบิตนั้นเป็น 0 หรือไม่ หากใช่ให้ข้ามไปเลย เพราะ 0 คูณกับอะไรก็ได้ 0 เสมอ
        If Mid$(txtBinary.Text, i, 1) <> 0 Then Dec = Dec + ((2 ^ BitWeight) * Mid$(txtBinary.Text, i, 1))
        
        ' เพิ่มค่าเลขยกกำลังขึ้นอีก 1
        BitWeight = BitWeight + 1
    Next
    
    ' #######################################################
    ' กรณีที่ไม่ใช้สมการ แต่ใช้น้ำหนักของแต่ละบิตคูณ 2 ต่อเนื่องจากบิตขวาไปซ้าย เช่น
    ' คูณ 2 เท่ามาเรื่อยๆ ... 1024 512 256 128 64 32 16 8 4 2 1
    'BitWeight = 1
    'For i = Len(txtBinary.Text) To 1 Step -1
    '    Dec = Dec + (BitWeight * Mid$(txtBinary.Text, i, 1))
    '    BitWeight = BitWeight * 2
    'Next
    ' #######################################################
    
    ' แสดงผลเลขฐาน 10 ใน TextBox
    txtDecimal.Text = Dec
    
    ' เรียกใช้ฟังค์ชั่นโดยการคำนวณหาค่าเลขฐาน 10 จากสมการโดยตรง
    MsgBox HexToDecimal(txtHexadecimal.Text)
    
End Sub

Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
    
    txtHexadecimal.Text = ""
    txtBinary.Text = ""
    txtDecimal.Text = ""
    
End Sub

Private Sub txtHexadecimal_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        KeyAscii = 0
        Call cmdConvert_Click
    Else
        ' ตรวจสอบการกดคีย์ให้รับได้เฉพาะค่า 0 - 9 และ A - F เท่านั้น
        KeyAscii = CheckHexaDecimal(KeyAscii)
    End If
End Sub

' #######################################################
' ฟังค์ชั่นตรวจสอบการกดคีย์ให้รับได้เฉพาะค่า 0 - 9 และ A - F เท่านั้น
' #######################################################
Function CheckHexaDecimal(Index As Integer)
    Select Case Index
        ' ASCII Code 48 - 57 คือ ตัวอักขระ 0 - 9
        ' ASCII Code 65 - 70 คือ ตัวอักขระ A - F
        Case 48 To 57, 65 To 70
        Case 8, 13
        Case Else
            Index = 0
    End Select
    CheckHexaDecimal = Index
End Function
Conclusion:
โดยตามปกติแล้วส่วนมากที่พยายามหาข้อมูลในการแปลงเลขฐานต่างๆ ก็เป็นโจทย์การบ้านกันแทบทั้งนั้นแหละครับ ซึ่งปกติในชีวิตจริงโอกาสที่เราจะใช้เลขฐานก็จะมีแค่ ฐาน 10 ฐาน 2 และ ฐาน 16 เท่านั้น ส่วนคนที่เรียนมาทาง Hardware หรือ เขียนภาษา Assembly ก็มักจะเกี่ยวข้องกับเลขฐาน 2 และ ฐาน 16 เท่านั้น ไม่นิยมใช้ฐาน 10 ดังนั้นบทความนี้ผมถึงได้แยกให้เห็นถึงการแปลงเลขฐาน 16 ไปหาเลขฐาน 2 ก่อน
    ผมขอยกตัวอย่างของการเขียนภาษา Assembly กับไมโครโปรเซสเซอร์ Z80 ขนาด 8 บิต - คำสั่งของการบวก (ADD)
  • LD A, 3F    ; นี่เป็นการกำหนดค่า 3F (ฐาน 16 ขนาด 8 บิต) ให้กับ Register A (ภาษาระดับสูงคือการกำหนดค่าให้ตัวแปร)
    LD B, 29    ; นี่เป็นการกำหนดค่า 29 (ฐาน 16 ขนาด 8 บิต) ให้กับ Register B
    ADD A, B   ; การนำค่าใน Register A บวกกับค่าใน Register B แล้วนำผลลัพธ์กลับไปเก็บที่ Register A (แบบไม่คิดค่าตัวทดของหลักซ้ายมือสุด)
    Register คือ หน่วยความจำชนิดหนึ่งที่อยู่ภายในตัว CPU แต่ละรุ่น แต่ละเบอร์
      วิธีการคิด (ด้วยมือ และ ในใจ) ยังแบ่งออกได้อีกหลักๆ 2 วิธี
    • เอาค่าฐาน 16 คือ 3F บวก 29 โดยตรงไปเลย
      3 F +
      2 9
      6 8 <--- คำตอบ
      นั่นคือเอา F ก็คือ 15 (ฐาน 10) บวกเข้ากับ 9 = 24 ค่าที่ได้มันเกินเลขฐาน 16 ก็ให้ลบออกจากเลขฐาน คือ 16 (24 - 16 = เศษ 8 ทด 1) ... หลักต่อไป 3 + 2 + 1 (ตัวทด) = 68 ... ง่ายมั้ยครับ
      ซึ่งมันไม่ได้คิดต่างไปจากเลขฐาน 10 เลย เช่น 29 + 5 ... คือเอา 9 + 5 = 14 ... 14 มันเกินค่าของเลขฐาน 10 ดังนั้นต้องเอา 14 - 10 = 4 เศษ 1 (เป็นตัวทด) ... ต่อไปเอา 2 + 1 (ตัวทด) ... ผลลัพธ์คำตอบคือ 34 นั่นเอง ... เห็นมั้ยครับว่าวิธีคิดมันต่างจากกับเลขฐาน 10 ตรงไหนล่ะ
    • แปลงเลขฐาน 16 แต่ละหลักให้เป็นเป็นเลขฐาน 2 ก่อนแล้วค่อยแปลงกลับเป็นเลขฐาน 16 อีกที
      3 F = 0011 1111 + (ฐาน 16 แต่ละตัว จะแทนเลข Binary ขนาด 4 บิต)
      2 9 = 0010 1001
      --> = 0110 1000 <-- แปลงเป็นเลขฐาน 16 จะได้
      --> =   6      8
    อนึ่ง ... ในการใช้เลขฐาน 2 มันมีความจำเป็นต่อการถอดรหัสคำสั่ง (Opcode) ก่อนด้วยน่ะครับว่าจะให้มันทำงานอะไร ... ซึ่งสมัยผมเรียนแต่ละคำสั่งเราต้องถอดรหัสกันด้วยมือ แต่ยุคสมัยนี้มี Assembler หรือ Simulator ให้ใช้งานได้ง่ายขึ้น ... ก็เพราะว่ามันง่ายนี่แหละ จึงทำให้เด็กรุ่นใหม่ๆ ขาดพื้นฐานที่ดีไป

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