2011-09-17 40 views
1

ビット単位の演算子は、PHPの整数でのみ動作し、整数の最大サイズは64ビットサーバでは2^63です。それより大きな値を作成すると、変数を浮動小数点にキャストし、ビット演算子が機能しなくなります。誤っiは整数のために大きすぎるた2^64に割り当て後者が2^63未満のthatsとしてこのビット単位のコードはどのように動作させることができますか?

<?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を返すし、それ:私は、次の例を持っていますfalseを返します。それが2^63よりも大きく働くようにする方法はありますか?さもなければ、私はビットペルムを最大63の異なるアイテムにしか使用できません。この関数の戻り値はintため

+0

これはまだ64の異なる項目です。あなたは2^0を忘れています。 – slebetman

+0

それは本当ですか?整数| 0は0を返し、falseと解釈されるでしょうか?どちらの方法で解決策を知っていますか?もしそうなら、それは非常に感謝します、ありがとう! Dave –

+2

@Dave 2^0 = 1、0ではない – FtDRbwLXw6

答えて

0

、多分あなたは、gmp_pow()関数を使用 、あなたがgmp_orを(使用することができますrusultsを計算する)とsteatmentsは、あなたが(gmp_and使用できるかどうかについてでした)

1

GMP

$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リソース(Gmp::number())または文字列((string) Gmp)であり、はるかに大きな数字で動作します。これは(see full code/demo)カプセル化され、頭に浮かぶオブジェクトも同様です。

+0

致命的なエラー:42行目のtest.phpで未定義の関数gmp_init()を呼び出す:( –

+0

上記にリンクされたgmp拡張をインストールする必要があります – hakre

+1

共有ホスティング、私の友人 :( –

0

あなたはビットの配列を使用して試みることができる:

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

あなたは$ nFlagsビットと$ bitsPerWord = 64が必要な場合は、その後、あなたは$ nFlags/$ bitsPerWord単語を作成します。

関連する問題