js实现补码

补码的基本概念
补码(Two's complement)是计算机中表示有符号整数的一种方式。其核心思想是通过最高位(符号位)表示正负,其余位表示数值。正数的补码与原码相同,负数的补码是其绝对值的二进制表示取反后加1。
实现补码转换的步骤
十进制转补码
- 确定数值的符号和位数(如8位、16位等)。
- 如果是正数,直接转换为二进制。
- 如果是负数:
- 计算其绝对值的二进制表示。
- 对所有位取反(0变1,1变0)。
- 对结果加1。
补码转十进制
- 检查最高位(符号位):
- 如果是0,直接按无符号二进制转换。
- 如果是1,表示负数:
- 对所有位取反。
- 加1后转换为十进制,最后添加负号。
JavaScript实现示例
十进制转补码(8位)
function decimalToTwosComplement(num, bits = 8) {
if (num >= 0) {
return num.toString(2).padStart(bits, '0');
} else {
const positive = (-num).toString(2).padStart(bits, '0');
const inverted = positive.split('').map(b => b === '0' ? '1' : '0').join('');
const twosComplement = (parseInt(inverted, 2) + 1).toString(2);
return twosComplement.slice(-bits); // 确保位数正确
}
}
补码转十进制
function twosComplementToDecimal(binaryStr) {
const bits = binaryStr.length;
if (binaryStr[0] === '0') {
return parseInt(binaryStr, 2);
} else {
const inverted = binaryStr.split('').map(b => b === '0' ? '1' : '0').join('');
const decimal = -(parseInt(inverted, 2) + 1);
return decimal;
}
}
使用示例
const num = -5;
const binary = decimalToTwosComplement(num, 8); // 输出 "11111011"
const original = twosComplementToDecimal(binary); // 输出 -5
注意事项
- 位数需明确指定(如8位、16位),否则可能因溢出导致结果错误。
- JavaScript的位运算符(如
>>、<<)默认使用32位补码,但直接操作时需注意符号扩展问题。 - 补码的位数决定了表示范围(如8位补码范围为-128到127)。







