ข้อดีของ Two's Complement คืออะไร


11

ในอุปกรณ์ ADC / DAC บางตัวเป็นตัวเลือกในการส่งออก / ป้อนข้อมูลในรูปแบบของส่วนประกอบ 2

อะไรคือข้อดีของการแสดงข้อมูลดิจิตอลในแบบฟอร์มการเติมเต็มของ Two เมื่อคุณสามารถมีรหัสไบนารี่แบบตรงและประหยัดเวลาในการแปลง


4
การชมเชยของสองคนเป็นรหัสไบนารี่ตรง ...
Mooing Duck

"พีชคณิตทำงานบนเครื่อง (เอกภพ) ที่เป็นส่วนประกอบสองอย่าง" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
ส่วนประกอบ 5 ในสองคืออะไร 101. อะไรคือ 5 ในรหัสไบนารี่แบบตรง? 101. -5 ในส่วนเติมเต็มของสองคืออะไร 1 ... 11111011 -5 ในไบนารี่รหัสตรงคืออะไร?
อ๊ะ

ดูเหมือนว่าเป็นกรณีพิเศษที่หายากที่จะมี ADC ที่มีเอาต์พุตเป็นลบหรือไม่? นั่นหมายความว่าอย่างไรแรงดันไฟฟ้าที่วัดได้ต่ำกว่าแรงดันไฟฟ้าต่ำอ้างอิง? และคุณจะสร้าง ADC เช่นนั้นได้อย่างไร ประมาณต่อเนื่องกับหมวกที่มีโหลดเชิงลบ ... ?
Lundin

โปรดทราบว่ามีสองที่แตกต่างกันคำเสริมและชมเชย หัวข้อที่นี่เป็นคำฟ้องของสองคนแม้ว่าสองคนนั้นสุภาพมากและมักจะพูดถึงสิ่งดีๆเกี่ยวกับคุณ
Pete Becker

คำตอบ:


11

คำชมเชยการแสดงจำนวนเต็มสองจำนวนที่มีเครื่องหมายถูกจัดการได้ง่ายในฮาร์ดแวร์ ตัวอย่างเช่นการปฏิเสธ (เช่นx = -x ) สามารถดำเนินการได้อย่างง่ายดายโดยการพลิกบิตทั้งหมดในจำนวนและเพิ่มหนึ่ง การดำเนินการเดียวกันในไบนารีแบบดิบ (เช่นกับบิตการลงชื่อ) มักจะเกี่ยวข้องกับการทำงานมากขึ้นเนื่องจากคุณต้องปฏิบัติบิตบางอย่างในสตรีมเป็นพิเศษ Same go for plus - การดำเนินการเพิ่มสำหรับตัวเลขลบนั้นเหมือนกับการดำเนินการบวกสำหรับตัวเลขบวกดังนั้นจึงไม่จำเป็นต้องใช้ตรรกะเพิ่มเติม (ไม่ต้องการใช้ pun) เพื่อจัดการกับกรณีลบ

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


1
การพลิกบิตจากนั้นเพิ่ม 1 เพื่อคัดค้านไม่ใช่?
Scott Seidman

2
@ScottSeidman ใช่ฉันลืมไปหน่อย แก้ไขเพื่อแก้ไข :)
พหุนาม

1
ที่จริงแล้วสำหรับการเลือกสูงสุดสูงสุดขึ้นอยู่กับโปรเซสเซอร์อาจเป็นรอบเดียวที่จะใช้x = x * -1 หรือx = 0 - xเมื่อเทียบกับรอบอย่างน้อยสองรอบสำหรับx = ~ x + 1
markt

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

5
+1 นอกจากนี้ส่วนประกอบของสองมีเพียงค่าเดียวสำหรับ 0 อื่น ๆ (เช่นส่วนเสริมหรือเครื่องหมายบิต) จบลงด้วยการมีสอง
sbell

5

ADC สามารถแปลงข้อมูล (พูดแรงดันไฟฟ้าอินพุตระหว่าง 0 ถึง 5V) และคุณต้องการข้อมูลที่ไม่ได้ลงชื่อ (0V = 0, 5V = รหัสสูงสุด) หรือลงนาม (2.5V = 0, 0V = สูงสุด -ve, 5V = สูงสุด + ve)

นอกเหนือจากการเสริม 2 ของการเป็นตัวแทนคอมพิวเตอร์ที่ธรรมดาที่สุดสำหรับข้อมูลที่ลงนามการแปลงระหว่างสองรูปแบบที่อธิบายข้างต้นเป็นเรื่องเล็กน้อยโดยสิ้นเชิง: เพียงแค่เปลี่ยน MSB!

นี่คือราคาถูกอย่างไม่น่าเชื่อในการเพิ่มตรรกะภายในของ ADC และทำให้ ADC เป็นจุดขายอีกแห่งในแผ่นข้อมูล ...


เพิ่งเพิ่มสวิตช์ MSB ระหว่างส่วนเติมเต็มของสองและออฟเซ็ตไบนารีตามความคิดเห็นด้านล่าง
Scott Seidman

3

หากคุณต้องการดำเนินการทางคณิตศาสตร์เกี่ยวกับตัวเลขที่เป็นลบการเติมเต็มสองครั้งจะทำให้ง่ายกว่าอ็อฟเซ็ตไบนารีซึ่งจะตรงกับชนิดข้อมูล "Sign int" คอมไพเลอร์ของคุณจะรู้วิธีจัดการกับมัน มิฉะนั้นคุณจะใช้เห็บนาฬิกาเพื่อแปลงไปมา


1

ในคำถามดูเหมือนว่าโดยนัยแล้วมันจะใช้เวลานานกว่านั้นสำหรับ ADC ที่จะส่งคืนค่าในรูปแบบที่สมบูรณ์ของ 2 มากกว่าในแบบไบนารี่ตรง แม้ว่านี่อาจจะเป็นกรณีที่การนำ ADC มาใช้โดยเฉพาะ แต่ก็ไม่เป็นความจริง (ตัวอย่างเช่นชุดควบคุมไมโครคอนโทรลเลอร์ MSP430 มีอุปกรณ์ต่อพ่วง ADC บนชิปซึ่งจะรายงานค่าเป็นไบนารี่ไบร์ทหรือส่วนเติมเต็ม 2 แต่ ใช้จำนวนรอบเท่ากันในทั้งสองกรณี)

ด้วยวิธีการที่ห่างไกลตัวเลือกระหว่างส่วนเติมเต็ม 2 และไบนารี่แบบตรงส่วนใหญ่จะมาลงที่การทำงานของเครื่องแปลงความถี่และวิธีที่คุณต้องการประมวลผลข้อมูลของคุณ

ในโหมดไบนารี่แบบตรง ADC จะให้ตัวเลขซึ่งแสดงถึงอัตราส่วนระหว่างขนาดของปริมาณอะนาล็อกที่วัด (แรงดันไฟฟ้าจริง) และปริมาณการอ้างอิงเต็มรูปแบบ ตัวอย่างเช่น ADC ขนาด 10 บิตสามารถส่งคืนค่าได้ตั้งแต่ 0 ถึง 1023 (รวม) หากคุณวัดแรงดันไฟฟ้า (กล่าวคือ 1.25 โวลต์) ซึ่งเป็นครึ่งหนึ่งของแรงดันอ้างอิงของ ADC (เช่น 2.50 โวลต์) รหัสไบนารี่ที่คุณอ่านจะเป็นครึ่งหนึ่งของค่าสูงสุดที่คุณสามารถอ่านได้ - ดังนั้น 512 หรือราว ๆ นั้น ขึ้นอยู่กับการปัดเศษและไม่เป็นเชิงเส้นใน ADC

ตัวอย่างเช่นสมมติว่าคุณมีทรานสดิวเซอร์ซึ่งรายงานปริมาณเชื้อเพลิงจรวดในถัง 0V หมายถึงถังว่างเปล่าและ 2.5 โวลต์หมายถึงเต็ม ดังนั้นคุณเพียงแค่เชื่อมต่อตัวแปลงสัญญาณไปยัง ADC ของคุณและออกไป!

แต่โปรดสังเกตว่าในย่อหน้าข้างต้นไม่มีวิธีวัดแรงดันลบ ถ้าเราต้องการวัดการไหลของเชื้อเพลิงจรวดเข้าและออกจากถัง (และเรามีตัวแปลงสัญญาณให้ทำเช่นนั้น) ADC ไม่สามารถวัดจำนวนลบได้ดังนั้นเราจึงมีปัญหา อย่างไรก็ตามมีวิธีง่าย ๆ ในการปลอมโดยใช้โหมดเสริมของ 2: ในกรณีนี้เอาต์พุตของตัวแปลงสัญญาณจะถูกลำเอียงอีกครั้งเพื่อให้จุดศูนย์อยู่กึ่งกลางระหว่างแรงดันไฟฟ้าอ้างอิงทั้งสองของ ADC กล่าวอีกนัยหนึ่งกระแสบวกจะถูกแทนด้วยแรงดันไฟฟ้าระหว่าง 1.25V ถึง 2.50V และกระแสเชิงลบจะถูกแทนด้วย 1.25V ถึง 0V ดังนั้นการไหลลงในถังจะให้รหัส ADC ที่ 512 ถึง 1,023 และจะไหลออกจากขอบพระคุณ รหัส 511 ถึง 0 (ในรูปแบบไบนารีตรง)

ตอนนี้มันไม่สะดวกอย่างมาก เราต้องลบ 512 จากการวัดแต่ละครั้งก่อนที่จะทำอะไรกับมันซึ่งจะให้ตัวเลขในช่วง -512 ถึง +511 จุดสำคัญของโหมดเสริม 2 คือการทำเช่นนี้ให้คุณ!

อย่างไรก็ตามคุณยังอาจต้องการใช้เลขฐานสองตรงกับตัวแปลงสัญญาณที่สร้างผลลัพธ์ที่เซ็นชื่อ ตัวอย่างเช่นตัวแปลงสัญญาณของคุณอาจมีเอาต์พุตที่แตกต่างกัน: ในกรณีนี้คุณต้องการที่จะลบเอาท์พุทกลับหัวกลับจากเอาท์พุทที่ไม่กลับด้านดังนั้นจึงไม่มีข้อได้เปรียบในการใช้ส่วนเสริม 2


1

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

ป้อนคำอธิบายรูปภาพที่นี่


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

และใช่เครื่องวัดระยะทางของนิสสันของฉันทำงานด้วยวิธีนี้


คำตอบของคุณเป็นเรื่องเกี่ยวกับน้ำล้น (และอันเดอร์โฟล์) แต่เนื่องจากระยะทางไม่ได้แสดงตัวเลขที่ติดลบก็ไม่ได้อยู่สิ่งที่สองของส่วนประกอบที่เกี่ยวข้องกับ ...
marcelm

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

@james large ไม่มันยังทำไม่ได้ ไม่มีอะไรในคำตอบที่จริง ๆ แล้วการจับคู่ทั้งสองเข้าด้วยกัน หรือส่วนประกอบหรือเครื่องหมาย - ขนาดหรือการแสดงหมายเลขที่ลงนามใด ๆ
marcelm

@marcelm ใช่แล้วคือ: แนวคิดหลักของระบบประกอบสอง: ศูนย์ลบหนึ่งเท่ากับจำนวนเต็มที่ไม่ได้ลงนามแทนได้สูงสุด นั่นเป็นความคิดของระบบประกอบสอง ไม่มีการแสดงตัวเลขที่ลงนามอื่น ๆ ที่เสนอนี้ (เพื่อความรู้ของฉัน) และตัวอย่างเครื่องวัดระยะทางแสดงให้เห็นว่าคุณสมบัติเชิงพฤติกรรมนี้มาจากความเรียบง่ายของวิศวกรรม ในกรณีของเครื่องวัดระยะทาง: จากวิศวกรรมเครื่องกล ในโลกเครื่องกลและอิเล็กทรอนิกส์มัน (ทั้งสองระบบประกอบ) เป็นวิธีที่ง่ายที่สุดที่จะทำให้มันทำงาน
PkP

0

คนอื่น ๆ ได้ตอบไปแล้วว่าทำไมคำชื่นชมไบนารีสองคำจึงสะดวกสำหรับฮาร์ดแวร์คอมพิวเตอร์ อย่างไรก็ตามคุณดูเหมือนจะถามว่าทำไม A / D จะแสดงผลสองคำชมแทน "ไบนารี่ตรง" (สิ่งที่คุณคิดว่าหมายถึง)

A / Ds ส่วนใหญ่ส่งออกค่าไบนารีที่ไม่ได้ลงนามอย่างง่ายตั้งแต่ 0 ถึง 2 N -1 โดยที่ N คือจำนวนบิตที่ A / D แปลงเป็น โปรดทราบว่านี่อาจถือได้ว่าเป็นเครื่องหมายแสดงความชื่นชมสองครั้งเพียงแค่ว่าค่าที่ไม่เคยเกิดขึ้นเป็นลบ หากคุณกำลังติดต่อกับตัวเลขที่เป็นบวกเท่านั้นการเป็นตัวแทนไบนารีส่วนใหญ่จะเหมือนกัน ซึ่งรวมถึงคำชมสองครั้งและขนาดสัญลักษณ์

A / Ds โดยเฉพาะอย่างยิ่งที่สร้างขึ้นในไมโครคอนโทรลเลอร์มีตัวเลือกในการผลิตค่าลบสำหรับช่วงครึ่งล่างของช่วง นี่อาจเป็นประโยชน์เมื่อรับรู้การวัดสัญญาณสองขั้ว

อย่างน้อยในไมโครคอนโทรลเลอร์นี่เป็นเรื่องโง่ ในบางกรณีคุณอาจใช้ค่า A / D โดยตรงโดยไม่มีการแปลงใด ๆ ในกรณีนี้คุณได้แปลงค่าอื่น ๆ ทั้งหมดเป็นช่วง A / D การ จำกัด จำนวนที่ไม่เป็นลบทั้งหมดทำให้สิ่งต่างๆง่ายขึ้น

มิฉะนั้นคุณจะใช้การปรับขนาดและการชดเชยกับการอ่าน A / D เพื่อนำไปใช้กับสิ่งที่คุณใช้สำหรับค่าภายใน ที่นี่อีกครั้งไม่มีข้อเสียของค่าที่ไม่ได้ลงชื่อที่ออกมาโดยตรงจาก A / D ในความเป็นจริงฉันมักจะใช้การกรองความถี่ต่ำผ่านค่าดิบก่อนปรับขนาดและชดเชย การรู้คุณค่าเหล่านั้นจะไม่ทำให้การคำนวณง่ายขึ้นเพียงเล็กน้อย การทำมาตราส่วนบนค่าที่ไม่ได้ลงชื่อยังทำให้บางครั้งง่ายขึ้นเล็กน้อย

ฉันจำไม่ได้ว่ามีกรณีเดียวในโครงการไมโครคอนโทรลเลอร์กว่า 100 โครงการที่ฉันใช้ A / D ในรูปแบบใด ๆ ยกเว้นรูปแบบเอาต์พุตที่ไม่ได้ลงนาม

ดังนั้นเพื่อตอบคำถามว่าข้อดีของการส่งออก A / D คือ "twos ชมเชย" มีสองคำตอบ:

  1. พวกเขาทั้งหมดทำอยู่ตลอดเวลาว่าค่าเหล่านี้ส่วนใหญ่จะไม่เป็นค่าลบดังนั้นคุณจึงไม่สามารถบอกความแตกต่างระหว่างคำชื่นชมสองครั้งและสัญลักษณ์อื่น ๆ ได้เช่นขนาดสัญญาณ

  2. ข้อดีมีน้อยมาก ภายในไมโครคอนโทรลเลอร์พวกมันไม่มีอยู่จริง

    ในฮาร์ดแวร์เฉพาะอาจมีข้อดีที่จะมีค่าลบที่ระบุแรงดันไฟฟ้าลบซึ่งในกรณีนี้การชมเชย twos เป็นวิธีที่ง่ายที่สุดในการจัดการกับช่วงของค่า โปรดทราบว่าหากช่วงแรงดันไฟฟ้าเข้าไม่ได้เป็นสมมาตรประมาณ 0 ดังนั้นข้อดีนี้จะหายไป


-1

นี่คือ 'รหัสไบนารีตรง' ที่คุณพูดถึงคืออะไร? ฉันถือว่าคุณหมายถึงมีบิตเครื่องหมายซึ่งเป็น '1' สำหรับลบและ '0' สำหรับบวก (หรือกลับกัน ) สิ่งนี้มีข้อเสียมากกว่าสองอย่างเกี่ยวกับส่วนประกอบสองอย่างที่ยังไม่ได้กล่าวถึง: วันนี้ส่วนใหญ่ไม่เกี่ยวข้องและสิ่งสำคัญอย่างหนึ่ง

สิ่งที่ไม่เกี่ยวข้องส่วนใหญ่คือคุณสามารถแสดงตัวเลขน้อยกว่าหนึ่งได้นั่นคือ 255 ตัวเลขใน 8 บิต นี่ไม่เกี่ยวข้องเลยทีเดียวเมื่อคุณมี 32 หรือ 64 บิต แต่สำคัญเมื่อคุณมี 4 หรือ 6 บิตให้ทำงาน

สิ่งที่สำคัญกว่าคือตอนนี้มีสองวิธีในการแสดงหมายเลขเดียวกันโดยเฉพาะ 0 - +0 และ -0 แต่ +0 และ -0 เป็นหมายเลขเดียวกันดังนั้นการใช้งานของคุณต้องทำให้แน่ใจว่าคุณไม่ได้เปรียบเทียบสิ่งเหล่านี้ ตัวเลขทุกครั้งที่คุณทำการตรวจสอบความเท่าเทียมกัน


ฉันคิดว่าคุณไม่ได้ติดตามที่นี่ คุณกำลังพูดถึงการเป็นตัวแทนสัญลักษณ์ขนาดเมื่อ OP ค่อนข้างชัดเจนพูดคุยเกี่ยวกับการเป็นตัวแทนไบนารีที่ไม่ได้ลงนาม
Joe Hass

1
หากคุณกำลังพูดถึงการเป็นตัวแทนที่ไม่ได้ลงชื่อนั้นจะไม่มีประโยชน์ใด ๆ มันเสียเพียงเล็กน้อย
Jack Aidley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.