在位掩码中设置位的正确方法是什么?
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。
我对在位掩码中设置位的正确方法有点困惑。我有以下功能和标志:
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。