2012-09-27 56 views
4

我使用按位运算来表示一个整数内的许多访问控制标志。在> 32位整数上使用按位运算符

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

简单地增加将工作提供了你肯定知道每个标志是两个电源,并且您不过去的52位长(由于量去标志一个Double-precision float能持有,因为这是JS用于数字的)。

如果无论出于何种原因需要超过52个标志,我建议将这些标志分组。

2

如果要进行按位运算,则不能超过32个。为了执行按位操作,javascript将数字值(它保存为8字节浮点数)转换为32位整数,然后对该值执行按位/位移操作。它将结果整数转换回浮点值,然后存储到变量中。欲了解更多信息,请参阅此Moz Dev Net article

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

由于PHP使用与平台相关的整数,因此您无法保证PHP可以处理多于32位的数据。所以在双方我都会建议将旗帜分组并分开保存。你可以用访问器将它们包装在对象中,以确保它们像一组标志而不是几个标志。