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

What is the correct way to set bit in bitmask?

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

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 的幂并使用 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
}

我认为你假设最低值位是"bit one",这实际上是不正确的。

考虑 "powers of two" 这是二进制数的基础...

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。