位掩码的32位整数在nodejs中产生负值

问题描述 投票:0回答:1

我正在尝试检查nodejs的最左2位是否存在,但是我得到一个负数,您能帮助我这里发生什么吗?我在cpp,php和ruby中尝试了相同的方法,并且效果很好

const pixel = 0xFF0F7700
const red = 0xFF000000

console.log("Bit Pixel: ", pixel.toString(2))
console.log("Bit Red:   ", red.toString(2))
console.log("Pixel & Red", ((pixel&red)).toString(2)) // The output is -1000000000000000000000000 , not even 32 bit length

红宝石中的类似代码,

puts (0xFF0F7700 & 0xFF000000).to_s(2) # the result is 11111111000000000000000000000000

谢谢:)

javascript node.js
1个回答
0
投票

您可以在这里阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Signed_32-bit_integers

[基本上,除移位外,按位运算符不能按您期望的方式工作(如果打开最高的32位位,因为在应用按位运算符之前,JS在应用该运算符之前将它们转换为32位二进制补码)。为什么他们这样做,我不知道,但这是它的工作方式?

因此,最好使用不具有怪异行为的移位,并提供根据是否要使用有符号或无符号值来提供或不保留符号位的位移运算符。

因此,对于您的操作,您可以这样做:

const pixel = 0xFF0F7700
const red = 0xFF000000

console.log("Bit Pixel: ", pixel.toString(2))
console.log("Bit Red:   ", red.toString(2))
console.log("Pixel & Red", (pixel >>> 24).toString(2))

然后,以这种方式获得想要的结果。您甚至可以像这样将它们放回原始位:

const pixel = 0xFF0F7700
const red = 0xFF000000

console.log("Bit Pixel: ", pixel.toString(2))
console.log("Bit Red:   ", red.toString(2))
console.log("Pixel & Red", (pixel >>> 24).toString(2))
console.log("Pixel & Red", ((pixel >>> 24) * 256 * 256 * 256).toString(2))

老实说,我现在不知道为什么64位处理器会被破坏。我想Java语言中的位操作不是一个优先事项。

© www.soinside.com 2019 - 2024. All rights reserved.