【问题标题】:Using bitwise operators on > 32 bit integers对 > 32 位整数使用位运算符
【发布时间】:2012-09-19 19:36:20
【问题描述】:

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

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)

【问题讨论】:

    标签: javascript math bitwise-operators


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2019-03-25
        • 2016-05-31
        相关资源
        最近更新 更多