[英]How can I make this bitwise code work?
按位運算符僅在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。
我想到了GMP ,這是封裝的( 請參閱完整代碼/ 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
對象也是如此。
由於此函數返回int,也許您可以使用gmp_pow()函數,並且可以使用gmp_or()來計算結果,對於if語句,可以使用gmp_and()
您可以嘗試使用位數組:
$bitArray = array();
$bitArray[0] = $word0;
$bitArray[1] = $word1;
.
.
.
如果您需要$ nFlags位並且$ bitsPerWord = 64,則將創建$ nFlags / $ bitsPerWord個單詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.