พยายามตอบทั้งคำถามที่ชัดเจน (CHAR_BIT คืออะไร) และคำถามโดยนัย (วิธีนี้ได้ผลอย่างไร) ในคำถามเดิม
ถ่านใน C และ C ++ แสดงถึงหน่วยความจำที่เล็กที่สุดที่โปรแกรม C สามารถระบุได้ *
CHAR_BIT ในภาษา C และ C ++ แทนจำนวนบิตในอักขระ ต้องมีค่าอย่างน้อย 8 เสมอเนื่องจากข้อกำหนดอื่น ๆ ในประเภทถ่าน ในทางปฏิบัติในคอมพิวเตอร์เอนกประสงค์สมัยใหม่ทั้งหมดนั้นมีค่าเท่ากับ 8 แต่ระบบประวัติศาสตร์หรือผู้เชี่ยวชาญบางระบบอาจมีค่าสูงกว่า
Java ไม่มีความเท่าเทียมกันของ CHAR_BIT หรือ sizeof จึงไม่จำเป็นต้องใช้เนื่องจากประเภทดั้งเดิมทั้งหมดใน Java มีขนาดคงที่และโครงสร้างภายในของอ็อบเจ็กต์จะทึบแสงสำหรับโปรแกรมเมอร์ หากแปลโค้ดนี้เป็น Java คุณสามารถแทนที่ "sizeof (int) * CHAR_BIT - 1" ด้วยค่าคงที่ 31
ในรหัสเฉพาะนี้จะถูกใช้เพื่อคำนวณจำนวนบิตใน int โปรดทราบว่าการคำนวณนี้ถือว่าประเภท int ไม่มีบิตช่องว่างภายใน
สมมติว่าคอมไพเลอร์ของคุณเลือกที่จะลงนามขยายในการเปลี่ยนแปลงบิตของตัวเลขที่ลงชื่อและสมมติว่าระบบของคุณใช้การแทนค่า 2s สำหรับจำนวนลบซึ่งหมายความว่า "MASK" จะเป็น 0 สำหรับค่าบวกหรือศูนย์และ -1 สำหรับค่าลบ
ในการลบล้างหมายเลขเสริมสองเราจำเป็นต้องดำเนินการในระดับบิตไม่ใช่แล้วเพิ่ม เท่า ๆ กันเราสามารถลบหนึ่งแล้วลบออกเป็นบิตได้
อีกครั้งสมมติว่าการแทนค่าสองส่วนเสริม -1 จะแสดงโดยทุกคนดังนั้นเอกสิทธิ์หรือด้วย -1 จึงเทียบเท่ากับการปฏิเสธแบบบิต
ดังนั้นเมื่อ v เป็นศูนย์จำนวนจะถูกปล่อยให้อยู่คนเดียวเมื่อ v เป็นหนึ่งมันจะถูกลบล้าง
สิ่งที่ต้องระวังคือการเซ็นชื่อล้นใน C และ C ++ เป็นพฤติกรรมที่ไม่ได้กำหนด ดังนั้นการใช้ ABS นี้กับค่าที่เป็นลบมากที่สุดจึงนำไปสู่พฤติกรรมที่ไม่ได้กำหนด สิ่งนี้สามารถแก้ไขได้โดยการเพิ่มการร่ายเพื่อให้บรรทัดสุดท้ายของโปรแกรมถูกประเมินเป็น int ที่ไม่ได้ลงนาม
* ซึ่งโดยปกติแล้วจะไม่เหมือนกับหน่วยความจำที่เล็กที่สุดที่ฮาร์ดแวร์สามารถระบุได้ การใช้งานสามารถรวมหน่วยความจำฮาร์ดแวร์แอดเดรสหลายหน่วยเข้าเป็นหน่วยเดียวของหน่วยความจำโปรแกรมแอดเดรสหรือแยกหน่วยความจำแอดเดรสฮาร์ดแวร์หนึ่งหน่วยออกเป็นหน่วยความจำที่สามารถเพิ่มโปรแกรมได้หลายหน่วย