按位运算符仅适用于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。
答案 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字。