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. `