0

私がこれを持っているとしましょう:

// different things you can do
var CAN_EAT = 1,
    CAN_SLEEP = 2,
    CAN_PLAY = 4,
    CAN_DANCE = 8,
    CAN_SWIM = 16,
    CAN_RUN = 32,
    CAN_JUMP = 64,
    CAN_FLY = 128,
    CAN_KILL = 256,
    CAN_BE_JESUS = Math.pow(2, 70);

// the permissions that I have
var MY_PERMS = CAN_EAT | CAN_SLEEP | CAN_PLAY | CAN_BE_JESUS;

// can I eat?
if(MY_PERMS & CAN_EAT) alert('You can eat!'); /* RUNS */

// can I sleep?
if(MY_PERMS & CAN_SLEEP) alert('You can sleep!'); /* RUNS */

// can I play?
if(MY_PERMS & CAN_PLAY) alert('You can play!'); /* RUNS */

// can I be jesus?
if(MY_PERMS & CAN_BE_JESUS) alert('You can be jesus!'); /* WONT RUN */

それを実行すると、食べたり、寝たり、遊んだりできることが出力されます。その数は 2^70 であるため、私がイエスになれるとは出力されません。数値を 2^31 にすればうまくいきます (私は 64 ビット マシンを使用していますが、上記の例を実行したときは Chrome を 32 ビット モードで実行している必要があります)。

ビット単位の演算子を扱うとき、PHPでも常にこの問題に直面しています。多くの場合、私は現在のシナリオに取り組むことができるので、リストに最大 31 個または 63 個のものを含めることは大したことではありませんが、それよりもはるかに多くする必要がある場合もあります。この制限を回避する方法はありますか? ビット演算子は非常に高速で便利です。

4

2 に答える 2

2

さて、これの問題は明らかに、ご想像のとおり、javascript の整数の幅です。thisによると、js の数値は最大 2^53 になるため、53 の異なるビットを持つことができます。thisによると、64 ビット マシンでは、php は最大 2^63 - 1 になるため、62 ビットになります。
さらに必要な場合は、デザインを再考する必要があります。旗を 2 つ (またはそれ以上) のグループに分けてください。各グループには独自の意味があります (食品関連のアクション、その他のアクション、その他など)。 ?

于 2012-04-12T11:34:31.050 に答える
0

詳細については、ECMAScript 言語仕様を参照してください。ECMAScript は JavaScript のサブセットです。ここここを確認してください。

` Some ECMAScript operators deal only with integers in the range -2^31
through 2^31 - 1, inclusive, or in the range 0 through 2^32-1, inclusive. 
These operators accept any value of the Number type but first convert 
each such value to one of 2^32 integer values. 
See the descriptions of the ToInt32 and ToUint32 operators in 9.5 and 
9.6, respectively. `
于 2014-01-30T10:24:33.837 に答える