我对在位掩码中设置位的正确方法有点不太了解。我有以下功能和标志:
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
预期的行为是否可能是错误的结果?
答案 0 :(得分:3)
将常量设置为2的幂,并使用Derived
而不使用bitshift。
or
答案 1 :(得分:0)
我认为你假设最低值位是&#34;位1&#34;,这实际上是不正确的。
考虑&#34; 2的权力&#34;这是二进制数的基础......
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。