如何在JavaScript中设置、清除和切换单个位?

99

如何在JavaScript中设置、清除、切换和检查位?


@user JavaScript和C/C++是不同的编程语言。从它们两者中获得不同的答案非常有帮助。 - cmac
4个回答

269

获取位掩码的方法:

var mask = 1 << 5; // gets the 6th bit

测试一个二进制位是否被设定:

if ((n & mask) != 0) {
  // bit is set
} else {
  // bit is not set
}

设置某位:

n |= mask;

为了澄清一下:

n &= ~mask;

要切换一位:

n ^= mask;

请参考Javascript位运算符


37

我想添加一些东西(感谢@cletus)

function bit_test(num, bit){
    return ((num>>bit) % 2 != 0)
}

function bit_set(num, bit){
    return num | 1<<bit;
}

function bit_clear(num, bit){
    return num & ~(1<<bit);
}

function bit_toggle(num, bit){
    return bit_test(num, bit) ? bit_clear(num, bit) : bit_set(num, bit);
}

2
太好了,谢谢。你能解释一下为什么 bit_test 能够工作吗?我懂得右移可以将有趣的位移动到最右边的位置,但我在尝试理解中间值以及为什么它被 2 除余数不为零时会感到困惑。 - Raoul
2
在将所需位移到最右侧位置后,您只需测试新值是否为奇数(new_value%2!= 0)。奇数将具有bit0 = 1,否则bit0 = 0(因为bit0的权重是2的0次幂,即1)。 - unloco
3
我认为“impair”应该是“奇数”(1、3、5、7……)。 - Teepeemm
1
是的,我有法国背景。我使用了“奇数”的法语单词(无法编辑以更正我的评论)。 - unloco
1
你是否有类似的函数来测试超出32位范围的数字? - birwin

24

获得位

function getBit(number, bitPosition) {
  return (number & (1 << bitPosition)) === 0 ? 0 : 1;
}

设置比特位

function setBit(number, bitPosition) {
  return number | (1 << bitPosition);
}

清除位

function clearBit(number, bitPosition) {
  const mask = ~(1 << bitPosition);
  return number & mask;
}

更新比特

function updateBit(number, bitPosition, bitValue) {
  const bitValueNormalized = bitValue ? 1 : 0;
  const clearMask = ~(1 << bitPosition);
  return (number & clearMask) | (bitValueNormalized << bitPosition);
}

这些示例来自于 JavaScript 算法与数据结构 仓库。


6

在 @cletus 的帮助下,我构建了一个 BitSet 类:

function BitSet() {
    this.n = 0;
}

BitSet.prototype.set = function(p) {
    this.n |= (1 << p);
}

BitSet.prototype.test = function(p) {
    return (this.n & (1 << p)) !== 0;
}

BitSet.prototype.clear = function(p) {
    this.n &= ~(1 << p);
}

BitSet.prototype.toggle = function(p) {
    this.n ^= (1 << p);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接