【问题标题】:How do you set, clear and toggle a single bit in JavaScript?如何在 JavaScript 中设置、清除和切换单个位?
【发布时间】:2010-11-29 00:24:02
【问题描述】:

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

【问题讨论】:

  • @user JavaScript 和 C/C++ 是不同的语言。从他们那里得到不同的答案非常有帮助。

标签: javascript numbers bit-manipulation


【解决方案1】:

获取位掩码:

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 bitwise operators

【讨论】:

    【解决方案2】:

    我想添加一些东西(感谢@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);
    }
    

    【讨论】:

    • 非常感谢。你能解释一下为什么 bit_test 有效吗?我理解将有趣的位移动到最右边的位置的右​​移,但是我迷失了试图理解中间值是什么以及为什么它除以 2 时的余数在设置时是非零的。
    • 在获得想要的位到最右边的位置后,您只需测试新值是否损坏 (new_value % 2 != 0)。受损数的 bit0 = 1 或 bit0 = 0(因为 bit0 的权重是 2 的 0 次方,即 1)
    • 我认为“损害”应该是“奇数”(1、3、5、7,...)。
    • 是的,我有法国背景。我用法语单词表示“奇怪”(无法编辑以更正我的评论)
    • 你有类似的函数来测试超过 32 位范围的数字吗?
    【解决方案3】:

    获取比特

    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 Algorithms and Data Structures 存储库。

    【讨论】:

      【解决方案4】:

      我在@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);
      }
      

      【讨论】:

        猜你喜欢
        • 2023-02-14
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        相关资源
        最近更新 更多