代码之家  ›  专栏  ›  技术社区  ›  Erik

在位掩码中设置位的正确方法是什么?

  •  0
  • Erik  · 技术社区  · 9 年前

    我对在位掩码中设置位的正确方法有点困惑。我有以下函数和标志:

    var userBmask = 0;
    
    const EMAIL_CONFIRMED = 1;
    const EMAIL_UNSUBSCRIBED = 2; 
    
    setBit: function (bit) {
        userBmask |= 1 << bit; // 10
    }
    

    假设我想为电子邮件确认设置位:

    setBit(EMAIL_CONFIRMED);
    

    在我上面的线之后 userBmask 是: 10 但我不确定这是否正确,因为实际上我设置了第二位,而不是第一位。我应该重写吗 setBit 从最右边的位到设置位的函数如下:

    setBit: function (bit) {
        userBmask |= 1 << bit - 1; // 01
    }
    

    现在之后 setBit(EMAIL_CONFIRMED) 我得到了结果 01

    编辑: 谢谢你的回答。请看下面的内容。因为我使用的是32位的javascript,所以我可以使用0…31位的位掩码。但如果我尝试设置最后一个可用位(为31),我会得到负数:

    const NEXT_BIT = 31; 
    
    setBit(NEXT_BIT); // userBmask now is -10000000000000000000000000000000
    

    这是预期的行为,可能是可能的错误的结果吗?

    2 回复  |  直到 9 年前
        1
  •  2
  •   AntiHeadshot Nikhil Kumbhar    9 年前

    将常数设置为2的幂,并使用 or 而没有比特移位。

    const EMAIL_CONFIRMED = 1<<0; //1
    const EMAIL_UNSUBSCRIBED = 1<<1; //2
    const NEXT_BIT1 = 1<<2; //4
    const NEXT_BIT2 = 1<<3; //8
    
    setBit: function (bit) {
        userBmask |= bit;
    }
    
    unsetBit: function (bit) {
        userBmask &= ~bit; //bitwise inverse
    }
    
        2
  •  0
  •   user5069935 user5069935    9 年前

    我想你是在假设最低值位是“位1”,这实际上是不正确的。

    考虑“二次幂”,它是二进制数的基础。。。

    2^0 == 1 //first bit is "bit zero" 
    2^1 == 2 //second bit is "bit one"
    2^2 == 4 //third bit is "bit two"
    2^3 == 8 //fourth bit is "bit three"
    //and so on
    

    如果将1左移1,则从2^0到2^1。所以二进制10是十进制2。

    如果你想在向函数传递1时设置userBmask中的最低位,那么是的,你必须在移位之前从位中减去1。