4

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

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)
4

2 回答 2

2

只要您确定每个标志都是 2 的幂,并且您不超过 52 位长(由于双精度浮点数可以容纳的数量,因为这就是 JS 用于数)。

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

于 2012-09-27T22:55:35.433 回答
2

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

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

由于 PHP 使用平台相关的整数,因此您也不能保证 PHP 可以处理超过 32 位的整数。因此,在双方,我都建议将您的标志分成几组并分别维护它们。您可以使用访问器将它们包装在对象中,以确保它们的行为类似于一组标志而不是多个标志。

于 2012-09-28T15:36:12.960 回答