DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on • Edited on

การแทนที่จำนวนเต็มติดลบ ด้วยเลขฐานสอง โดยใช้เทคนิค Two’s Complement

คอมพิวเตอร์เก็บข้อมูลโดยแทนข้อมูลอยู่ในรูปแบบ Binary หรือแสดงออกเป็นเลขฐานสองที่มีได้แค่ 0 และ 1 เรียงต่อกัน

แต่เลขฐานสองจะไม่มีความหมายอะไรเลย จนกว่าเราจะมานิยามให้มันว่าแต่ละชุดของตัวเลขแทนอะไรบ้าง

ดังนั้นจำนวนเต็มที่ติดลบก็เช่นกัน ถ้าเราจำกัดจำนวนบิตเอาไว้ที่ 8 บิต แสดงว่าเราจะสามารถเอาเลขฐานสอง 8 บิตนี้แทนสิ่งต่างๆได้ 256 สิ่ง (2 ยกกำลัง 8) เช่นถ้าแทนจำนวนเต็มที่ไม่ติดลบ เราแทนที่ได้คือ 0 ถึง 255

ดังนั้นถ้า 8 บิตแล้วเราอยากแทนที่ทั้งเลขบวก และ เลขลบ นั้นก็สามารถทำได้โดยการแบ่งจำนวนสัญลักษณ์ทั้ง 256 ตัวนั้นออก 128 ตัวใช้สำหรับเลขลบ อีก 128 ตัวใช้สำหรับ จำนวนที่ไม่เป็นลบ ดังนั้นเลขที่แทนที่ได้ก็จะเปลี่ยนเป็นช่วง -128 ถึง 127

ปัญหาต่อมาแล้วเราจะเอาเลขฐานสองแบบไหนล่ะที่แทนที่เลขลบทั้ง 128 ตัวนั้น

สิ่งที่ระบบคอมพิวเตอร์ส่วนใหญ่ที่เราใช้อยู่ปัจจุบันใช้เทคนิคที่เรียกว่า two's complement นั่นคือในเมื่อเราแบ่งเลขเป็นช่วง -128 จนถึง 127 แล้วนั้นก็ทำให้เลขบวกตั้งแต่ 128 ถึง 255 นั้นหายไป ดังนั้นเราจะเอาฐานสองที่เคยใช้แทน 128 จนถึง 255 นั่นละมาใช้แทนเลข -128 จนถึง -1

ถ้าเรียงเปรียบเทียบกันระหว่างระบบที่เราแทนที่แค่จำนวนเต็มกับจำนวนติดลบแบบ two's complement จะเป็นแบบนี้



0 1 2 3 ... 127  128  129  130 ...  255
0 1 2 3 ... 127 -128 -127 -126 ... -1


Enter fullscreen mode Exit fullscreen mode

อาจจะดูแปลกๆ แต่ถ้าสังเกตดีๆจะพบว่ามันทำให้เลขขยับไปในทิศทางบวก 1 เหมือนเดิมจาก 128 จนถึง 255 และ -128 จนถึง -1

ประโยชน์ของ two's complement อีกอันนั้นคือถ้าเรามีฐานสองของเลขบวก เราสามารถคำนวณเลขฐานสองของจำนวนลบของสิ่งนั้นได้เช่น เรามีฐานสองของ 127 แบบนี้



127 

ฐานสองคือ 

01111111


Enter fullscreen mode Exit fullscreen mode

วิธีหา -127 คือกลับบิตของ 127 จาก 0 เป็น 1 และ 1 เป็น 0 แล้วเอามาบวกด้วย 1 นั่นเอง



01111111

กลับบิต

10000000

แล้วบวก 1

10000001 


Enter fullscreen mode Exit fullscreen mode

10000001 ก็คือเลข 129 ในระบบที่ไม่มีเลขลบ แต่ก็เทียบได้เป็น -127 ในระบบที่มีจำนวนติดลบได้นั่นเอง

ส่วนถ้าเรามี -127 เราทำวิธีเดียวกันก็จะได้ฐานสองของ 127 กลับมาเช่นกัน

ประโยชน์อีกเรื่องสำหรับ two's complement นั่นคือ ทำให้เราสามารถลบเลขฐานสองได้โดยใช้แค่การบวกเลขฐานสองนั่นเอง เช่นเราต้องการลบ 100 - 50

เราสามารถเขียนได้เป็น 100 + (-50) นั่นคือให้เราหาเลขฐานสองของ -50 ก่อนแล้วค่อยเอาไปบวกกับ 100 นั่นเอง



100 ฐานสองคือ                     01100100
50 ฐานสองคือ                      00110010
ดังนั้น -50 ฐานสองคือ 11001101 + 1 = 11001110

100 + (-50) คือ

 01100100 +
 11001110 ได้
100110010

แต่ว่าระบบเราตอนนี้ใช้แค่ 8 บิตเราสามารถตัดบิตที่เกินไปได้เลยก็จะได้คำตอบเป็น 00110010 ซึ่งก็คือ 50 นั่นเองเป็นคำตอบของ 100 - 50


Enter fullscreen mode Exit fullscreen mode

Buy Me A Coffee

Top comments (0)