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

时间:2016-01-20 08:16:10

标签: javascript bit boolean-logic boolean-operations

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

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 个答案:

答案 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。