0

說工作我有這樣的:位運算符停止後2^31

// different things you can do 
var CAN_EAT = 1, 
    CAN_SLEEP = 2, 
    CAN_PLAY = 4, 
    CAN_DANCE = 8, 
    CAN_SWIM = 16, 
    CAN_RUN = 32, 
    CAN_JUMP = 64, 
    CAN_FLY = 128, 
    CAN_KILL = 256, 
    CAN_BE_JESUS = Math.pow(2, 70); 

// the permissions that I have 
var MY_PERMS = CAN_EAT | CAN_SLEEP | CAN_PLAY | CAN_BE_JESUS; 

// can I eat? 
if(MY_PERMS & CAN_EAT) alert('You can eat!'); /* RUNS */ 

// can I sleep? 
if(MY_PERMS & CAN_SLEEP) alert('You can sleep!'); /* RUNS */ 

// can I play? 
if(MY_PERMS & CAN_PLAY) alert('You can play!'); /* RUNS */ 

// can I be jesus? 
if(MY_PERMS & CAN_BE_JESUS) alert('You can be jesus!'); /* WONT RUN */ 

然後,如果我運行它,它會打印出,我可以吃飯,睡覺和玩耍。它不會打印出我可以是耶穌,因爲那個數字是2^70。如果我將數字設置爲2^31,那麼它將起作用(我在64位計算機上,但在運行上述示例時必須在32位模式下運行Chrome)。

在處理按位運算符時,我總是在PHP中遇到這個問題。通常我可以使用我所處的場景,使我的列表中最多有31或63件事情沒有什麼大不了的,但有時我需要的不僅僅是這些。有沒有辦法解決這個限制?按位運算符非常快速,方便。

+0

語言?你說,「PHP ......」。 – 2012-04-08 01:34:26

+0

我的歉意,上面的例子是JavaScript。 – Macmee 2012-04-08 01:35:15

回答

2

好吧,這個問題很明顯,正如你懷疑的那樣,javascript中整數的寬度。根據this,js中的數字可以上升到2^53,所以你可以有53個不同的位。根據this,在64位機器上,php一路高達2^63-1,所以你得到62位。
如果你需要更多,你應該重新考慮你的設計 - 你可能會把旗幟分成2個或更多的組,每組有其自己的含義(如與食物相關的動作,其他動作,其他等等。)?

0

您可以在ECMAScript Language Specification中閱讀更多關於它的內容,ECMAScript是JavaScript的一個子集,請檢查herehere

` Some ECMAScript operators deal only with integers in the range -2^31 
through 2^31 - 1, inclusive, or in the range 0 through 2^32-1, inclusive. 
These operators accept any value of the Number type but first convert 
each such value to one of 2^32 integer values. 
See the descriptions of the ToInt32 and ToUint32 operators in 9.5 and 
9.6, respectively. `