js实现补码
补码的基本概念
补码(Two's complement)是计算机中表示有符号整数的一种方式。正数的补码与原码相同,负数的补码是其绝对值的二进制表示取反后加1。

实现补码转换的步骤
将十进制数转换为补码的二进制表示:

- 确定数值的绝对值的二进制表示。
- 如果是负数,对二进制表示取反(0变1,1变0)。
- 对取反后的结果加1。
JavaScript实现补码转换
以下是一个将十进制数转换为指定位数的补码二进制字符串的函数:
function toTwosComplement(num, bits) {
// 处理正数
if (num >= 0) {
return num.toString(2).padStart(bits, '0');
}
// 处理负数
const positiveValue = (-num).toString(2).padStart(bits, '0');
let inverted = '';
for (let i = 0; i < positiveValue.length; i++) {
inverted += positiveValue[i] === '0' ? '1' : '0';
}
const twosComplement = (parseInt(inverted, 2) + 1).toString(2);
return twosComplement.slice(-bits);
}
使用示例
console.log(toTwosComplement(5, 8)); // 输出: "00000101"
console.log(toTwosComplement(-5, 8)); // 输出: "11111011"
从补码还原十进制数
以下函数将补码二进制字符串转换回十进制数:
function fromTwosComplement(binaryStr) {
const bits = binaryStr.length;
const num = parseInt(binaryStr, 2);
// 检查最高位是否为1(负数)
if (binaryStr[0] === '1') {
return -( (~num & ( (1 << bits) - 1 ) ) + 1 );
}
return num;
}
使用示例
console.log(fromTwosComplement("00000101")); // 输出: 5
console.log(fromTwosComplement("11111011")); // 输出: -5
注意事项
- 补码的位数需要足够表示数值范围,否则会出现溢出。
- JavaScript的位运算符(如
~、>>等)默认使用32位补码表示。






