【发布时间】:2020-04-03 11:52:56
【问题描述】:
所以我正在尝试按照我见过的有关 BitMasks 和 Bit Manipulation 的教程进行操作,例如 this,但没有得到预期的结果。
var a = 0b11110000000000000000000000000000
var b = 0b10010000000000000000000000000000
var c = a & b
console.log(c.toString(2))
// ...
AND 运算符只会在所有参数都有一个的每个位置放置一个。
expected 0b10010000000000000000000000000000
received -0b01110000000000000000000000000000
Here 和其他地方展示了如何清除和设置单个位,但我想知道位的范围/跨度。
- 我如何选择模式
0b11110000000000000000000000000000中的设置位。因此,任何具有0b101101010101...或任何其他前 6 位数字的内容都将提取为像0b1011010000...或0b101101这样的数字,其中该数字是 6 位数字,或者是带有所有尾随 rhs 值的 32 位数字设置为 0。这样我可以对整数进行一次检查,以检查它是否具有特定模式。 - 如何从整数中清除或删除这些位,因此我不是以 6 个 lhs 位结束,而是以剩余的 26 个 rhs 位结束。
【问题讨论】:
-
问题又是 JS 的歧义。就像 JS 对字符串和数字的处理以及经常(但不总是)可互换性一样,您也可以使用数字。 JS 的位操作在(并返回)32 位 signed 整数上执行。
0b11110000000000000000000000000000被解析为数字4026531840,对于 int 来说太大了。这是一个double,对应的int是-268435456。例如,当您使用0b1111<<28或使用const int = v => v|0时,您就会明白这一点。
标签: javascript bit-manipulation