PHP中最多63位?

时间:2014-02-06 16:55:41

标签: php arrays integer bit-manipulation

我正在建立一个系统,我需要为用户分配特定(个人)数量的资产。这些资产(可能数以万计)。

我想用按位比较来做这件事,所以如果用户可以访问资产1和2,则存储值为3,访问1,2和3时的值为7等等。

访问不一定是顺序的,因此用户可以轻松访问资产10,12和24324.

我很快就遇到了一个问题,即服务器无法获取超过第63位的资产,所以很明显我要么误解了某些东西,要么就是存储这种信息的位是一种愚蠢的方式。

我在64位Linux系统上运行的代码是这样的(显然只是出于测试目的,发现了这样的限制):

<?php

$bitwise = $_GET['bitwise'];

if (isset($bitwise)) {

    echo "<br/>bitwise input: ";
    echo $bitwise;
    $bitcount = 0;
    for ($i=1;$i<=$bitwise;$i*=2) {

        if (($i & $bitwise) > 0) {

            $bitcount++;
            echo "<br/>{$bitcount}: " . $i . " is in " . $bitwise;

        }

    }

}

&GT;

我通过查询字符串输入测试值。但是,无论我输入什么值,我可以得到的最大数量是63。

所以,我的问题是:这只是因为我正在使用按位比较来解决他们不理想的事情(我的理论),还是我的实现错误?

我的下一个解决方案是将“位”存储在数组中,因此如果有人可以访问资产1,2和3,我会将其列表存储为[1,2,3]。人们不太可能访问超过一百个特定资产。这是一种合理的方法吗?我意识到这会把这个问题放在有待讨论的领域,但希望它仍然足够具体。

如果服务器必须同时为大量客户提供服务,那么当然,最重要的是性能。

(请原谅错误的术语,希望我的意思很明确。)

1 个答案:

答案 0 :(得分:2)

这是标准行为 - 在64位编译的PHP上,整数的最大长度为64位。虽然它可以温暖我的秘密灰胡子心,但如果你有超过64种不同的角色,那么对于访问控制来说,一个按位解决方案是错误的。

另外两件值得一提的事。

首先,出于性能原因这样做可能是Web应用程序的过早优化。如果有的话,ACL查找在很长一段时间内不会成为系统的瓶颈。此外,鉴于语言的动态类型性质,不清楚按位运算符是否提供了如此多的PHP性能优势。

其次,你被限制在63位的原因是因为PHP(似乎?)使用Two's compliment来实现有符号整数。最后一位用于表示正数或负数。我曾经问过this question关于按位NOT的问题,这就是为什么这个问题引起了我的注意。