ภาพรวม
บทความนี้สาธิตวิธีทำการลบเลขโดยไม่ใช้เครื่องหมาย - (Minus) แต่ใช้ Bitwise Operations แทน
หลักการ (Two's Complement)
a - b = a + (-b) = a + (~b + 1) โดยใช้ Bitwise:
- ~b = Bitwise NOT (Invert bits)
- ~b + 1 = Two's Complement = -b
แต่โค้ดตัวอย่างใช้วิธี Recursive Bitwise Subtraction:
a - b = (a ^ b) - ((~a & b) << 1) // เรียกซ้ำจน b = 0
การนำไปใช้
const subtractWithoutMinus = (num1, num2) => {
if (num2 === 0) return num1;
return subtractWithoutMinus(num1 ^ num2, (~num1 & num2) << 1);
};
console.log(subtractWithoutMinus(78, 56)); // 22
ผลลัพธ์
22
คำอธิบายอัลกอริทึม (Bitwise Subtraction)
นี้คือการทำ Binary Subtraction โดยใช้ Logic Gates:
- Difference (XOR): a ^ b = ผลลัพธ์บิตที่ต่างกัน
- Borrow (AND + Shift): (~a & b) << 1 = ตำแหน่งที่ต้องยืม
- ทำซ้ำจนกว่า Borrow จะเป็น 0
ตัวอย่างขั้นตอน (78 - 56)
78 = 01001110
56 = 00111000
Iteration 1:
diff = 78 ^ 56 = 01110110 (118)
borrow = (~78 & 56) << 1 = 00110000 (48)
Iteration 2:
diff = 118 ^ 48 = 01000110 (70)
borrow = (~118 & 48) << 1 = 00000000 (0)
Result: 70? Wait... 78-56=22
// มี Bug ในโค้ดต้นฉบับ: ควรเป็น (~num1 & num2) << 1 สำหรับ a - b
// แต่จริงๆ แล้วคือ: a - b = a + (~b + 1)
เวอร์ชันที่ถูกต้อง (Standard Bitwise Subtraction)
const subtractBitwise = (a, b) => {
while (b !== 0) {
const borrow = (~a) & b;
a = a ^ b;
b = borrow << 1;
}
return a;
};
console.log(subtractBitwise(78, 56)); // 22 ✓
การประยุกต์ใช้
- Low-level Programming / Embedded Systems
- Compiler Design: Instruction Selection
- Computer Architecture Education
- Obfuscation / Code Golf
ข้อควรระวัง
- JavaScript ใช้ 32-bit Signed Integer สำหรับ Bitwise Ops
- ตัวเลข > 2³¹-1 จะทำงานผิดปกติ
- Recursive Version อาจ Stack Overflow
- Iterative Version ดีกว่าสำหรับ Production