2016-01-20 124 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