วันอังคารที่ 31 สิงหาคม พ.ศ. 2553

ระบบเลขฐานและตรรกศาสตร์

บทที่ 2 : ระบบเลขจำนวน

คอมพิวเตอร์เป็นเครื่องจักรที่กลไกการทำงานพื้นฐานเป็นสองสถานะ (Binary) คือเปิดวงจรกับปิดวงจร ซึ่งสามารถแทนสถานะดังกล่าวได้ด้วยตัวเลขโดดสองตัวคือ 0 กับ 1 ข้อมูลแบบอื่นของคอมพิวเตอร์จะเกิดจากการประกอบรวมกันของเลข 0 กับ 1 เท่านั้น เราเรียกระบบเลขจำนวนที่ประกอบด้วยตัวเลข 0 กับ 1 เท่านั้นว่า “เลขฐาน 2”
ส่วนการนับของมนุษย์โดยปกตินั้น เราจะมีตัวเลขโดดอยู่สิบตัวคือ 0, 1, 2, 3, 4, 5, 6, 7, 8, และ 9 ซึ่งจะประกอบรวมกันเป็นระบบเลขจำนวนที่เรียกกันว่า “เลขฐาน 10” จะเห็นว่าระบบเลขจำนวนที่ใช้ในคอมพิวเตอร์มีความแตกต่างจากระบบเลขจำนวนที่มนุษย์ใช้กันโดยปกติ ดังนั้นเราจะต้องเรียนรู้ถึงทักษะในการคำนวณของระบบเลขจำนวนทั้งสองแบบรวมถึงวิธีการเปลี่ยนระบบเลขจำนวนไปมา

2.1 ความหมายของตัวเลขในหลักต่าง ๆ
ในระบบเลขฐานสิบนั้น ค่าของเลขโดด ณ ตำแหน่งใด ก็คือค่าของเลขโดดนั้นคูณด้วยสิบยกกำลังของตำแหน่งนั้น เช่น 12345 หมายความว่า ค่า 5 อยู่ในตำแหน่งหลักหน่วยซึ่งค่าของสิบยกกำลังของหลักหน่วยคือ 100 ค่า 4 อยู่ในตำแหน่งของหลักสิบ (101) ค่า 3 อยู่ในตำแหน่งของหลักร้อย (102) ค่า 2 อยู่ในตำแหน่งของหลักพัน (103) และค่า 1 อยู่ในตำแหน่งของหลักหมื่น (104) ซึ่ง 12345 สามารถเขียนอยู่ในรูปผลบวกทางคณิตศาสตร์ได้ดังนี้
12345 = (1 x 104) + (2 x 103) + (3 x 102) + (4 x 101) + (5 x 100)
= 10000 + 2000 + 300 + 40 + 5
จะเห็นว่าเลขกำลังของสิบจะเริ่มต้นจากศูนย์ที่หลักหน่วย แล้วเพิ่มขึ้นหนึ่งทุกครั้งในหลักถัดมาทางด้านซ้ายมือ ในกรณีที่เลขเป็นจำนวนทศนิยม ให้เริ่มกำลังศูนย์ที่หลักหน่วย แล้วลดกำลังลงหนึ่งทุกครั้งในหลักถัดไปทางด้านขวามือ ส่วนทางด้านซ้ายมือก็จะเป็นไปในรูปแบบเดิม เช่น 12.34 จะสามารถเขียนได้เป็น
12.34 = (1 x 101) + (2 x 100) + (3 x 10-1) + (4 x 10-2)
= 10 + 2 + 0.3 + 0.04
เราสามารถใช้หลักการเดียวกันนี้กับเลขฐานสองเพื่อหาค่าของจำนวนดังกล่าวในรูปของเลขฐานสิบ (ในความเป็นจริงแล้วสามารถที่จะนำไปใช้ได้กับเลขทุกฐาน) เช่น 1011.012 จะเขียนได้เป็น
1011.012 = (1 x 23) + (0 x 22) + (1 x 21) + (1 x 20) + (0 x 2-1) + (1 x 2-2)
= 8 + 0 + 2 + 1 + 0 + 0.25
= 11.25

2.2 การแปลงค่าจากเลขฐานสิบเป็นเลขฐานสอง
การแปลงเลขฐานสิบเป็นฐานสองจะมีขั้นตอนอยู่สองขั้นตอนคือ การแปลงเลขส่วนที่อยู่หน้าทศนิยมและการแปลงเลขส่วนที่อยู่หลังทศนิยม
การแปลงเลขในส่วนที่อยู่หน้าทศนิยม ให้นำเลขดังกล่าวมาหารด้วยสองไปเรื่อย ๆ จนกว่าจะได้ผลลัพธ์เป็นศูนย์ โดยการหารแต่ละครั้งจะได้เศษเป็น 0 หรือ 1 ลำดับของเศษที่เกิดขึ้นก็คือกำลังของเลขสอง กล่าวคือ เศษที่ได้จากการหารครั้งแรกจะเป็นเลขในหลัก 20, เศษที่เกิดจากการหารครั้งที่สองจะเป็นเลขในหลัก 21 เรื่อยไป




ตัวอย่าง จงเปลี่ยนค่า 1310 ให้เป็นเลขฐานสอง

2  13
6 เศษ 1
3 เศษ 0
1 เศษ 1
0 เศษ 1

 1310 = 11012

ส่วนการแปลงเลขหลังจุดทศนิยมนั้น จะใช้วิธีคูณตัวเลขนั้นด้วยสองไปเรื่อย ๆ จนกว่าจะมีเลขหลังจุดทศนิยมเป็นศูนย์ ซึ่งในการคูณแต่ละครั้งอาจจะมีการทดค่าหลังจุดทศนิยมขึ้นมาเป็นตัวเลข 1 หน้าจุดทศนิยมหรือไม่ก็ได้ ในการคูณแต่ละครั้งก็เท่ากับว่าเราเลื่อนการคำนวณจากหลักแรกหลังจุดทศนิยม (2-1) ไปยังหลักต่อไป

ตัวอย่าง จงเปลี่ยนค่า 0.2510 ให้เป็นเลขฐานสอง
0.25
x 2
0.50
x 2
1.00


.01
 0.2510 = 0.012

ดังนั้นจากตัวอย่างข้างต้นสามารถสรุปได้ว่า 13.2510 = 1101.012

2.3 การบวกและการลบเลขฐานสอง
การบวกเลขฐานสองมีหลักการเหมือนกับการบวกเลขฐานสิบ การบวกเลขในฐานสิบนั้นเมื่อผลบวกในหลักใดมีค่ามากกว่า 9 ก็จะต้องมีการทดเลข 1 ไปยังหลักถัดไป ซึ่งหลักเกณฑ์การทดเลขนี้ยังสามารถใช้ได้กับเลขฐานสอง เพียงแต่ว่าเลขโดดที่สูงที่สุดของเลขฐานสองคือ 1 ดังนั้นถ้าผลบวกมีค่าเกิน 1 ก็จะมีการทดไปยังหลักถัดไปทางซ้าย รูปแบบการบวกเป็นดังนี้

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 ทด 1

ตัวอย่าง จงบวกเลข 1011.1012 กับ 110.0112

1 0 1 1 . 1 0 1
+ 1 1 0 . 0 1 1
1 0 0 1 0 . 0 0 0

การลบเลขเป็นการดำเนินการที่ผกผันกับการบวก ในการลบ ถ้ามีการลบเลขที่มากกว่าจากเลขที่น้อยกว่า ต้องมีการขอยืมจากเลขในหลักถัดไปทางซ้ายมา 1 รูปแบบการลบเป็นดังนี้

0 - 0 = 0
0 - 1 = 1 ขอยืม 1
1 - 0 = 1
1 - 1 = 0

ตัวอย่าง จงลบเลข 1001.11 กับ 101.1

1 0 0 1 . 1 1
- 1 0 1 . 1 0
1 0 0 . 0 1

2.4 การคูณและการหารเลขฐานสอง
การคูณและการหารของเลขฐานสอง ก็มีหลักการเช่นเดียวกับเลขฐานสิบ เพียงแต่มีสูตรคูณแค่แม่ 0 กับ 1 เท่านั้น อีกทั้งการหารด้วยศูนย์ก็ไม่มีความหมายเช่นเดียวกับการหารในระบบเลขฐานสิบ ตารางการคูณและการหารของระบบเลขฐานสองคือ
0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1
0  1 = 0
1  1 = 1

ตัวอย่าง จงคูณเลขฐานสอง 1.01 x 10.1
1 . 0 1
x 1 0 . 1 0
1 0 1
0 0 0
1 0 1
1 1 . 0 0 1
จงหารเลขฐานสอง 11001  101
101
101  11001
101
101
101

2.5 เลขฐานแปดและเลขฐานสิบหก
ถึงแม้ว่าระบบคอมพิวเตอร์จะเข้าใจแต่ระบบเลขฐานสองเพียงอย่างเดียว แต่ในทางปฏิบัติจะเกิดปัญหากับผู้ใช้งานคอมพิวเตอร์เป็นอย่างมาก เนื่องจากระบบเลขฐานสองมีจำนวนเลขโดดน้อยจึงต้องมีจำนวนหลักมากขึ้นเพื่อแทนค่าตัวเลขต่าง ๆ ทำให้จดจำได้ยาก จึงมีความพยายามในการรวมหลักของเลขฐานสองหลาย ๆ หลักเข้าด้วยกันเป็นเลขฐานที่ใหญ่ขึ้น เพื่อให้ง่ายต่อการจดจำ ซึ่งการแปลงเลขฐานที่ได้นี้กลับเป็นเลขฐานสองจะทำได้อย่างง่ายดายเนื่องจากแต่ละหลักของเลขฐานดังกล่าวแทนเลขฐานสองที่มีจำนวนหลักแน่นอน
โดยปกติแล้วเรามักจะรวมเลขฐานสองจำนวนสามหรือสี่หลักเป็นเลขฐานใหม่ เมื่อเรารวมเลขฐานสอง 3 หลักจะได้เลขที่มี 8 รูปแบบแตกต่างกันคือ 000, 001, 010, 011, 100, 101, 110, และ 111 ซึ่งเราสามารถใช้ตัวเลขโดด 0 ถึง 7 แทนเลขฐานสองในแต่ละแบบได้ ซึ่งระบบเลขจำนวนที่มีตัวเลขโดด 8 ตัวก็คือเลขฐานแปดนั่นเอง โดยที่เลขโดดแต่ละเลขของระบบเลขฐานแปดจะแทนรูปแบบของเลขฐานสองจำนวนสามหลักที่มีค่าเท่ากัน
ในทำนองเดียวกัน ถ้าเรามีเลขฐานสองจำนวนสี่หลัก ก็จะได้เลขฐานสองที่มี 16 รูปแบบแตกต่างกัน ซึ่งสามารถใช้เลขฐานสิบหกแทนแต่ละรูปแบบของเลขฐานสองได้ แต่เนื่องจากเรามีเลขโดดใช้งานกันแค่สิบตัว ดังนั้นจึงมีการนำตัว A – F มาแทนค่าเลขโดดที่มีค่า 10 – 15 แทน ทำให้เลขฐานสิบหกมีเลขโดดคือ 0 – 9 และ A – F
เลขฐานสิบ เลขฐานสอง เลขฐานแปด เลขฐานสิบหกๆ
0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
ในการแปลงเลขฐานสองให้เป็นเลขฐานแปดหรือฐานสิบหกนั้น เราจะต้องจับกลุ่มเลขฐานสองให้ได้จำนวนหลักตามที่เลขโดดของฐานที่เราจะแปลงไป เช่น จับกลุ่มสามหลักสำหรับการแปลงเป็นฐานแปด เป็นต้น การจับกลุ่มจะเริ่มจับจากหลักทางด้านขวามือสุดก่อน ในกรณีที่เหลือเลขไม่ครบจำนวนหลักที่ต้องการให้เติมศูนย์ไปทางด้านซ้ายมือเรื่อย ๆ จนกว่าจะได้จำนวนหลักที่ต้องใช้ จากนั้นจึงแปลงฐานเลขโดยแปลงทีละกลุ่มก็จะได้เลขฐานแปดหรือฐานสิบหกตามต้องการ

ตัวอย่าง จงแปลงเลขฐานสอง 1011011 ให้เป็นเลขฐานแปดและฐานสิบหก

แปลงเป็นเลขฐานแปด แปลงเป็นเลขฐานสิบหก

001 011 011 0101 1011

1 3 3 5 B

 10110112 = 1138 = 5B16

2.6 บิต, ไบต์, เวิร์ด และนิบเบิล
ข้อมูลต่าง ๆ ในระบบคอมพิวเตอร์มักจะไม่ได้มาจากเลขฐานสองเพียงแค่หลักเดียว เพื่อความสะดวกในการเรียกและความกระทัดรัดของจำนวนที่จะต้องใช้เรียก (คงไม่สะดวกนักถ้าต้องมีการเรียกกันว่า เลขฐานสอง 32 หลัก) ดังนั้นจึงได้มีการตั้งชื่อเฉพาะเรียกกลุ่มของเลขฐานสองที่มีจำนวนหลักตั้งแต่หนึ่งหลักขึ้น โดยชื่อต่าง ๆ มีดังนี้

เลขฐานสองหนึ่งหลักเรียก หนึ่ง“บิต” (bit)
4 บิต เท่ากับ หนึ่ง“นิบเบิล” (nibble) [ไม่ค่อยนิยมใช้กันนัก]
2 นิบเบิล เท่ากับ หนึ่ง“ไบต์” (byte)
2 ไบต์ เท่ากับ หนึ่ง“เวิร์ด” (word)
2 เวิร์ด เท่ากับ หนึ่ง“ดับเบิ้ลเวิร์ด” (double word)

2.7 ระบบเลข 2’ Complement
การคำนวณเลขฐานสองที่เราคุ้นเคยกัน มักจะเป็นเลขฐานสองที่มีค่าเป็นบวกอยู่เสมอ แต่ในความเป็นจริงเรามีการใช้งานจำนวนทั้งที่เป็นบวกและลบ ดังนั้นระบบคอมพิวเตอร์จึงต้องมีกลไกบางอย่างเพื่อระบุเครื่องหมายของตัวเลขต่าง ๆ ที่อยู่ในระบบ หนึ่งในวิธีการระบุเครื่องหมายของตัวเลขในระบบคอมพิวเตอร์ที่ได้รับความนิยมมากที่สุดก็คือ วิธี 2’ Complement
วิธี 2’ Complement จะเริ่มจากการกำหนดจำนวนหลักสูงสุดของตัวเลข (จำนวนบิตสูงสุด) กระบวนการทางคณิตศาสตร์ใด ๆ ก็ตาม ถ้าทำให้เกิดการทดเลขเลยบิตซ้ายสุดที่กำหนด เลขทดดังกล่าวจะหายไป เช่น ถ้ากำหนดให้ตัวเลขมีทั้งหมด 4 บิต 1111 บวกกับ 0001 จะเท่ากับ 0000 ไม่ใช่ 10000 เป็นต้น แต่ถ้ามีการขอยืมจากหลักหน้าสุดที่เป็นศูนย์ ให้ถือเสมือนว่ามีหลักที่เป็นค่า 1 อยู่ถัดออกไปจากบิตสูงสุดที่กำหนดไว้ แล้วทำการขอยืมตามปกติ เช่น ถ้าต้องการลบตัวเลขขนาด 4 บิต 0100 ด้วย 0111 จะถือว่าเลข 0100 เสมือนเป็น (1)0100 แล้วจึงลบกันตามปกติ เป็นต้น
ข้อกำหนดข้อที่สองของ 2’ Complement คือบิตที่ถูกกำหนดให้เป็นบิตนัยสำคัญสูงที่สุดจะเป็นบิตที่บอกเครื่องหมายของตัวเลข เช่น กำหนดให้ใช้ตัวเลขขนาด 6 บิต ดังนั้นบิดที่ 5 (เริ่มนับทางขวาสุดเป็นบิตที่ 0) จะเป็นบิตที่ระบุเครื่องหมายของตัวเลขนั้น เป็นต้น โดยการระบุเครื่องหมายจะใช้มาตรฐานว่า “ถ้าบิตหน้าสุดเป็น 0 หมายถึงเป็นเลขบวก ถ้าบิตหน้าสุดเป็นหนึ่งหมายถึงเป็นเลขลบ” ดังนั้นจึงไม่สามารถใช้บิตทุกบิตที่กำหนดให้ในการเก็บค่าตัวเลขได้
ข้อกำหนดข้อที่สามของ 2’ Complement คือ ค่าตัวเลขที่เก็บอยู่เมื่อบวกกับค่าที่มีเครื่องหมายตรงกันข้ามกันตามแบบวิธีการบวกเลขฐานสองปกติ จะต้องได้ผลลัพธ์เป็นศูนย์ (แต่จะมีบิตทดที่หลุดหายทางซ้ายมือสุด) เช่น ถ้ากำหนดให้เป็นตัวเลขขนาด 4 บิต 1011 จะเท่ากับค่า –5 เพราะถ้าบวกกับ 0101 แล้วจะได้ (1)0000 โดยเลขทดด้านหน้าสุดจะหายไป เป็นต้น
จากข้อกำหนดทั้งหมดข้างต้น ถ้ากำหนดให้ตัวเลขที่ใช้มีขนาด 1 ไบต์ จะสามารถเก็บค่าบวกระหว่าง 0 (00000000) ถึง 127 (01111111) และค่าลบระหว่าง –1 (11111111) ถึง –128 (10000000)
การนำเลข 2’ Complement ไปบวกหรือลบกัน จะสามารถทำได้ตามวิธีการปกติ แต่จะผลลัพธ์สุดท้ายจะต้องเป็นไปตามข้อกำหนดของ 2’ Complement ทั้งสามข้อ สำหรับการคูณและการหารนั้นจะต้องแยกค่าสัมบูรณ์ (Absolute) ออกมาคูณหารกัน แล้วจึงนำเครื่องหมายมาคิดภายหลัง แต่มีข้อควรระวังคือ ถ้าเป็นการคูณกันระหว่างตัวเลขขนาด 1 ไบต์ด้วยกัน ผลลัพธ์ที่ได้จะต้องใช้ที่เก็บขนาด 2 ไบต์ (ดูตัวอย่างในเรื่องการคูณเลขฐานสอง) ซึ่งมากเกินกว่าที่จะเก็บได้ ดังนั้นถ้าต้องการเก็บผลลัพธ์ไว้เป็นขนาด 1 ไบต์ ก็จะต้องให้ตัวตั้งและตัวคูณมีขนาดไม่เกิน 1 นิบเบิล (4 บิต)

2.8 ระบบเลข BCD (Binary Code Decimal)
ระบบเลข BCD มีชื่อเรียกอีกชื่อหนึ่งว่า Packed Decimal เป็นวิธีการหนึ่งที่จะทำให้การแปลงเลขระหว่างฐานสองกับฐานสิบง่ายขึ้นโดยใช้วิธีเดียวกับการสร้างเลขฐานสิบหก โดยจัดกลุ่มให้เลขฐานสอง 4 บิต เป็นเลขฐานสิบ 1 หลัก แต่จำนวนเลขโดดของเลขฐานสิบมีค่าน้อยกว่ารูปแบบของเลขฐานสองที่เป็นไปได้ใน 4 บิต ดังนั้นจึงมีเลขฐานสองบางรูปแบบที่ไม่ได้ถูกใช้งาน สาเหตุที่ต้องจัดกลุ่มเลขฐานสองให้เป็น 4 บิตแทนที่จะเป็นค่าอื่น ๆ เพราะจำนวนเลขโดดของเลขฐานสองมีค่าเท่ากับ 10 ซึ่งอยู่ระหว่าเลขฐานสอง 3 บิตกับ 4 บิต นั่นเอง
ปกติแล้วเรามักจะไม่นำเลข BCD ไปคำนวณแบบซับซ้อน มักจะนำไปบวกลบกันเท่านั้นซึ่งการบวกลบกันของเลข BCD จะต้องทำทีละ 1 นิบเบิล และต้องปรับค่าผลลัพธ์เพื่อเลี่ยงเลขฐานสองที่ไม่ได้ใช้งานด้วย

2.9 มาตรฐาน IEEE 754
มาตรฐาน IEEE754 เป็นมาตรฐานที่ถูกกำหนดขึ้นโดยหน่วยงานชื่อ IEEE (…) เพื่อเป็นมาตรฐานในการเก็บเลขทศนิยม (Floating Point) ในระบบคอมพิวเตอร์ โดยมาตรฐาน IEEE754 จะเก็บเลขทศนิยมฐานสิบในรูป
(-1 x S)1.M x 2E-B

โดยที่ S เป็นตัวระบุเครื่องหมายของตัวเลข ถ้าเป็น 0 จะเป็นบวก ถ้าเป็น 1 จะเป็นลบ
1.M เป็นฐานของเลขยกกำลัง อยู่ในรูป 1.XXXX
E เป็นตัวยกกำลังของสอง ไว้สำหรับระบุตำแหน่งของทวินิยม
B เป็นค่า BIAS เพื่อให้ค่าของ E ไม่ติดลบ จะมีค่าคงที่สำหรับทุกหมายเลข (ค่าของ B จะถูกกำหนดมาแล้วคือ 127 สำหรับ IEEE754 ขนาด 32 bit)

เช่น 2.5 จะสามารถเขียนได้เป็น (-1 x 0)1.010 x 2128-B
ในการเก็บค่าต่าง ๆ จะเก็บอยู่ในรูป S-M-E โดย S จะมีขนาด 1 บิต ส่วน M และ E จะมีขนาดแตกต่างกันไปหลายขนาด ขึ้นอยู่กับความละเอียดที่ต้องการ
มาตรฐาน IEEE754 นอกจากจะสามารถแทนค่าเลขทศนิยมปกติแล้ว ยังมีข้อกำหนดที่สามารถใช้แทนสิ่งที่เรียกกันว่า NaN (Not a Number) เช่น ค่าอินฟินิตี้ ด้วย
การคำนวณเลขตามมาตรฐาน IEEE754 มีความซับซ้อนมาก ดังนั้นจึงไม่ขอกล่าวในที่นี้

ที่มา computer.pcru.ac.th/jitranan/Assembly/document.doc

1 ความคิดเห็น:

  1. ขอบคุณมากครับ ข้อมูลนี้เป็นประโยชน์สำหรับผมมากเลยครับ

    ตอบลบ