如何使这个按位代码工作?

时间:2011-09-17 17:17:16

标签: php bit-manipulation bitwise-operators

按位运算符仅适用于PHP中的整数,并且64位服务器上的整数的最大大小为2 ^ 63。如果我创建一个大于该值的值,它会将我的变量强制转换为浮点数,并且按位运算符将停止运行。我有以下示例:

<?php

$CAN_DANCE = 2;

$CAN_SING = 4;

$CAN_PLAY = 8;

$CAN_BEGOD = pow(2,64);

$userperms =  $CAN_PLAY | $CAN_DANCE | $CAN_SING | $CAN_BEGOD;

if($userperms & $CAN_DANCE)
    echo 'This will work';

if($userperms & $CAN_BEGOD)
    echo 'This will not work';

?>

当然,对于第一次检查,它将返回true,因为它小于2 ^ 63但是对于后者我将其分配给2 ^ 64,这对于整数而言太大而且它错误地返回false。有没有办法让它工作超过2 ^ 63?否则,我只能在最多63个不同的项目中使用bitperms。

3 个答案:

答案 0 :(得分:1)

GMP浮现在脑海中,这是封装的(see full code/demo):

$CAN_DANCE = Gmp(2);

$CAN_SING = Gmp(4);

$CAN_PLAY =  Gmp(8);

$CAN_BEGOD = Gmp(2)->pow(64);    

$userperms = Gmp($CAN_PLAY)->or($CAN_DANCE, $CAN_SING, $CAN_BEGOD);    

if($userperms->and($CAN_DANCE)->bool())
    echo 'This will work', "\n";

if($userperms->and($CAN_BEGOD)->bool())
    echo 'This will work', "\n";

这将适用于更大的数字,但是,数字是资源(Gmp::number())或字符串((string) Gmp),只要每个实例都存在,Gmp对象也是如此

答案 1 :(得分:0)

因为这个函数返回int,也许你可以使用gmp_pow()函数, 并且要计算结果,你可以使用gmp_or(),对于if,你可以使用gmp_and()

答案 2 :(得分:0)

您可以尝试使用位数组:

$bitArray = array();
$bitArray[0] = $word0;
$bitArray[1] = $word1;
. 
.
.

如果你需要$ nFlags位和$ bitsPerWord = 64,那么你将创建$ nFlags / $ bitsPerWord字。