说我有这个:

// 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件事并不是什么大问题,但有时我需要的还不止这些。有什么办法可以解决这个限制?按位运算符是如此快速,便捷。

最佳答案

好吧,您所怀疑的是,这显然是javascript中整数宽度的问题。根据this,js中的数字最多可以达到2 ^ 53,因此您可以有53个不同的位。根据this的说法,在64位计算机上,php一直上升到2 ^ 63-1,因此您获得了62位。
如果您需要更多,则应重新考虑您的设计-您是否可以将标志分为2个(或更多)组,每个组都有其自己的含义(例如与食物相关的动作,其他动作等)。 ?

10-06 04:42