如何使用TypeScript说明二进制位移位中的有符号问题?(2^31>>n)

jtw3ybtb  于 2023-02-13  发布在  TypeScript
关注(0)|答案(1)|浏览(100)

我正在做一个用32位二进制整型数来表示棋盘上的棋子的棋盘程序,为了计算可能的移动,我对整数进行了位移位,但这对最后一位不起作用。
通过将2^31加到int(2147483648)中,将第32位设置为当前值,但问题是,当我对该值应用右移位时,得到的是一个负数。

const test = 0b1000_0000_0000_0000_0000_0000_1000_0000;

console.log(test) //2147483776
console.log(test >> 0) //-2147483520

console.log(test >> 5) //-67108860
// expected output: 67108868

console.log(toBinary(test >> 5)) //1111_1100_0000_0000_0000_0000_0000_0100
//expected output: 0000_0100_0000_0000_0000_0000_0000_0100

我认为这个问题与有符号整数的限制有关,有没有办法将其设置为无符号整数来解决这个问题?或者有没有其他方法可以解决这个问题?

k10s72fa

k10s72fa1#

您要查找unsigned right shift(又称填零右移)>>>。它不扩展符号位,而是将零移入。例如:

const test = 0b1000_0000_0000_0000_0000_0000_1000_0000;

console.log(test);        // 2147483776
console.log(test >>> 0);  // -2147483520

console.log(test >>> 5);  // 67108868

console.log(toBinary(test));
// => 1000_0000_0000_0000_0000_0000_1000_0000
console.log(toBinary(test >>> 5));
// => 0000_0100_0000_0000_0000_0000_0000_0100

function toBinary(value) {
    const str = value.toString(2).padStart(32, "0");
    return str.replace(/(\d{4})/g, "_$1").substring(1);
}

相关问题