簡體   English   中英

如何使此按位代碼工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM