在>上使用按位运算符32位整数

时间:2012-09-27 22:48:36

标签: javascript math bitwise-operators

我正在使用按位运算,以便在一个整数内表示许多访问控制标志。

ADMIN_ACCESS = 1;
EDIT_ACCOUNT_ACCESS = 2;
EDIT_ORDER_ACCESS = 4;

var myAccess = 3; // ie: ( ADMIN_ACCESS | EDIT_ACCOUNT_ACCESS )

if ( myAccess & EDIT_ACCOUNT_ACCESS ) { // check for correct access
   // allow for editing of account

}

大多数情况发生在我项目的PHP端。但是有一个部分,在保存某人的访问级别时,Javascript用于使用|加入多个访问标记。这很好用。我发现一旦整数(标志)变得太大(> 32位),它就不再适用于Javascript中的按位运算符。例如:

alert( 4294967296 | 1 ); // equals 1, but should equal 4294967297

我试图找到一个解决方法,这样我就不必将访问控制标志的数量限制为32.每个访问控制标志是前一个控制标志的两倍,这样每个控制标志都不会干扰其他控制标志。控制标志。

dec(4) = bin(100)
dec(8) = bin(1000)
dec(16) = bin(10000)

我注意到,当将这些标志中的两个与一个简单的+一起添加时,它似乎与按位or操作得出相同的答案,但我的头很难缠绕这是否是一个简单的替换,或者这样做是否存在问题。任何人都可以对此变通办法的有效性发表评论吗?例如:

(4294967296 | 262144 | 524288) == (4294967296 + 262144 + 524288)

2 个答案:

答案 0 :(得分:2)

只要你确定每个标志是2的幂,并且不超过52位(由于数量为{{3),只需添加标志即可。可以保持,因为这是JS用于数字的原因。)

如果由于某种原因,您需要超过52个标志,我建议将标志分组。

答案 1 :(得分:2)

如果要进行按位操作,则不能超过32。为了执行按位运算,javascript将数值(保存为8字节浮点数)转换为32位整数,然后对该值执行按位/位移操作。它会在存储到变量中之前将生成的整数转换回浮点。有关详细信息,请参阅此Moz Dev Net article

您仍然可以对浮点数执行整数运算,最高可达9007199254740992,即2 ^ 53。但由于上述原因,您不能使用超过32位的按位运算符。

由于PHP使用依赖于平台的整数,因此您无法保证PHP可以处理超过32位。所以在双方都建议将你的旗帜分成小组并分开维护。您可以将它们包装在具有访问器的对象中,以确保它们的行为类似于一组标志而不是几个标志。