4

1つの整数内で多くのアクセス制御フラグを表すために、ビット演算を使用しています。

ADMIN_ACCESS = 1;
EDIT_ACCOUNT_ACCESS = 2;
EDIT_ORDER_ACCESS = 4;

var myAccess = 3; // ie: ( ADMIN_ACCESS | EDIT_ACCOUNT_ACCESS )

if ( myAccess & EDIT_ACCOUNT_ACCESS ) { // check for correct access
   // allow for editing of account

}

これのほとんどは私のプロジェクトのPHP側で発生しています。|ただし、誰かのアクセスレベルを保存するときに使用して、Javascriptを使用して複数のアクセスフラグを結合する部分が1つあります。これはある程度うまく機能します。整数(フラグ)が大きくなりすぎると(> 32ビット)、Javascriptのビット演算子では正しく機能しなくなることがわかりました。例えば:

alert( 4294967296 | 1 ); // equals 1, but should equal 4294967297

アクセス制御フラグの数を32に制限する必要がないように、この回避策を見つけようとしています。各アクセス制御フラグは、他の制御フラグと干渉しないように、前の制御フラグの2倍です。

dec(4) = bin(100)
dec(8) = bin(1000)
dec(16) = bin(10000)

これらのフラグの2つを単純なものと一緒に追加する+と、ビット演算と同じ答えが得られるように見えますがor、これが単純な置換であるか、問題がある可能性があるかどうかに頭を悩ませていることに気付きました。これを行うことで。誰かがこの回避策の有効性についてコメントできますか?例:

(4294967296 | 262144 | 524288) == (4294967296 + 262144 + 524288)
4

2 に答える 2

2

ビット単位の演算が必要な場合は、32を超えることはできません。ビット単位の演算を実行するために、javascriptは数値(8バイトの浮動小数点数として保持されます)を32ビット整数に変換してから、その値に対してビット単位/ビットシフト演算を実行します。結果の整数を浮動小数点に変換してから、変数に格納します。詳細については、このMozDevNetの記事を参照してください。

2 ^ 53である9007199254740992まで、フロートに対して整数演算を実行できます。ただし、上記の理由により、32ビットを超えるビット演算子は使用できません。

PHPはプラットフォームに依存する整数を使用するため、PHPが32ビット以上を処理できることを保証することはできません。したがって、両方の側で、フラグをグループに分割し、それらを別々に維持することをお勧めします。それらをアクセサ付きのオブジェクトでラップして、複数ではなく1つのフラグセットのように動作するようにすることができます。

于 2012-09-28T15:36:12.960 に答える
2

各フラグが 2 の累乗であり、52 ビットを超えないことがわかっている場合は、単純にフラグを追加するだけで機能します (倍精度浮動小数点数が保持できる量のため、これは JS が使用するものであるため)。数字)。

何らかの理由で 52 個を超えるフラグが必要な場合は、フラグをカテゴリにグループ化することをお勧めします。

于 2012-09-27T22:55:35.433 に答える