2016-01-20 95 views
0

我有点混淆了正确设置位掩码位的方法。我有以下功能和标志:在位掩码中设置位的正确方法是什么?

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

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

考虑“的两权”,这是二进制数的基础...

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。

2

将您的常量设置为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 
} 
+0

感谢您的回答 – Erik

相关问题