javascript 和 java 之间的按位运算有什么不同

What is the different of bitwise operation between javascript and java

我正在将一些代码从 java 脚本转换为 java。当开始处理一些按位运算时,我发现 javascript 和 java 之间的按位运算行为非常不同。我在JVM方面比较有经验,操作对我来说似乎很正常。但是在 javascript 方面,我有点困惑。我检查了 MDN on mozilla 列出的演示对我来说似乎很正常,但我发现了一些情况,与我预期的不一样。

问题:

  1. 你能帮忙解释一下为什么我附加的代码中的按位运算 & 在 javascript 和 java 中如此不同吗?

  2. 此外,我知道我在 javascript 方面的知识不足以让我在这两种语言之间执行某种代码转换,是否有任何有用的网站可以帮助我更好地理解 javascript 中数字数据的按位运算或数据结构?

Java代码

        Long x = 4023233417L;
        System.out.println(String.format("%d => %s",x, Long.toBinaryString(x)));
        Long y = 2562383102L;
        System.out.println(String.format("%d => %s",y, Long.toBinaryString(y)));
        Long result = x & y;
        System.out.println(String.format("%d => %s",result, Long.toBinaryString(result)));

        //Output
        //4023233417 => 11101111110011011010101110001001
        //2562383102 => 10011000101110101101110011111110
        //2290649224 => 10001000100010001000100010001000

Java脚本代码

x= 4023233417
console.log(x.toString(2))
y = 2562383102
console.log(y.toString(2))
result = x & y
console.log(result.toString(2))
//Output
//11101111110011011010101110001001
//10011000101110101101110011111110
//-1110111011101110111011101111000

我希望 x 和 y 应该是“10001000100010001000100010001000”。

但是在java脚本代码中,结果是: “-1110111011101110111011101111000”

在javascript中,您只能对32位数字进行位运算。即使 javascript 使用 IEEE 754 浮点标准来表示数字。可以对 32 位数进行按位运算。因此其余的位将被忽略。

要将任何数字转换为其 32 位表示形式,number | 0。当 javascript 读取 x & y 时,它会考虑 x 和 y 的 32 位并忽略其他位。在您的情况下,您按位执行的数字是 x = -271733879y = -1732584194.

Javascript中按位运算的安全范围是Math.pow(-2,31)(-2147483648,约-21亿)到Math.pow(2,32)-1(2147483647,约+21亿)。

x= 4023233417;
console.log(x.toString(2))
y = 2562383102 ;
console.log(y.toString(2));

result = x & y;

console.log(result.toString(2)); //-1110111011101110111011101111000

x = x | 0; //-271733879
y = y | 0; //-1732584194
console.log("32 bit x: " + x);
console.log("32 bit y: " + y);
result = x & y;

console.log(result.toString(2)); //-1110111011101110111011101111000