2011-09-17 19 views
1

按位運算符只能在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'; 

?> 

當然它會返回針對第一檢查真正作爲後者我將其分配到2^64是一個整數,它錯誤地太大那小於2^63但是返回false。有沒有辦法讓它工作超過2^63?否則,我將只能夠使用最多63個不同項目的聲調。

+0

這仍然是64個不同的項目。你忘記2^0。 – slebetman

+0

你確定嗎?整數| 0會返回0這將被解釋爲假它不會?無論哪種方式,你知道一個解決方案?如果是這樣,將不勝感激,謝謝! Dave –

+2

@Dave 2^0 = 1,而不是0. – FtDRbwLXw6

回答

0

因爲這個函數返回INT,也許你可以使用gmp_pow()函數, 並計算對照。結果,你可以使用gmp_or()和中頻steatments你可以使用gmp_and()

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對象也是如此。

+0

致命錯誤:在第42行的test.php中調用未定義的函數gmp_init():( –

+0

您需要安裝上面鏈接的gmp擴展 – hakre

+1

共享主機,我的朋友 :( –

0

你可以嘗試使用了一下數組:

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

如果您需要$ NFLAGS位和$ bitsPerWord = 64,那麼你將創建$ NFLAGS/$ bitsPerWord話。