0

Sharepoint 2007 ファームを実行していて、ユーザー権限を計算しようとしています。マスクを取得する特定のメタデータ フィールドに関するこの投稿を読みました。そして、どのマスクと比較する必要があるかを確認するために、次のガイドを見てきました。

これが私のデリマです。IE javascript コンソールで次のコードを実行するたびに、0 が返されます。

((0x4000000000000000).toString(16) & (0x400001F07FFF1BFF).toString(16))

それぞれのバイナリ値は次のとおりであるため、これが正しくないことがわかりました。

100000000000000000000000000000000000000000000000000000000000000
100000000000000000000011111000001111111111111110001101111111111

どちらが等しいか

100000000000000000000000000000000000000000000000000000000000000

また、これを Windows 電卓に入れました。これは、私が頭がおかしくないことを確認するためです (そして、これらの非常に長い 2 進数を取得するためです)。

この行にたどり着いたとき、自分のブラウザが 32 ビット (これは、これを使用しているサイトの要件です) であり、これが 64 ビットの数値であることに気付きました!

32 ビット ブラウザを使用して、2 つの 64 ビット数値のビットごとの AND を (できれば 1 行で) 計算するにはどうすればよいですか?

数値をバイナリ文字列に変換し、ループを利用して各ビットをチェックできることは知っていますが、より簡単な方法はありますか?

編集 -この投稿 からの情報と以下の回答を利用した解決策私は次の解決策を思いつきました:

     var canEdit = false;
var canEditMask = [0x00000000,0x00000004];
var canApprove = false;
var canApproveMask = [0x00000000,0x00000010];
var canRead = false;
var canReadMask = [0x00000000,0x00000001];
var canDesign = false;
var canDesignMask = [0x00000000,0x00000800];
var mask = [originalmask.substring(0,10).toString(16),
                  ("0x"+itemperms.substring(9)).toString(16)];
canEdit = (mask[0] & canEditMask[0]) >0 || (mask[1] & canEditMask[1]) >0;
canRead = (mask[0] & canReadMask[0]) >0 || (mask[1] & canReadMask[1]) >0;
canDesign = (mask[0] & canDesignMask[0]) >0 || (mask[1] & canDesignMask[1]) >0;
canApprove = (mask[0] & canApproveMask[0]) >0 || (mask[1] & canApproveMask[1]) >0;
4

2 に答える 2

1

私は今晩同じ問題に遭遇したので、2^32 を超える値のビットごとの AND および OR を許可するように次のように記述しました。

    function bitand(val, bit) {
        if (bit > 0xFFFFFFF || val > 0xFFFFFFF) {
            var low = val & 0xFFFFFFF;
            var lowbit = bit & 0xFFFFFFF;
            val /= 0x10000000;
            bit /= 0x10000000;
            return (val & bit) * 0x10000000 + (low & lowbit);
        }
        return (val & bit);
    }

    function bitor(val, bit) {
        if (bit > 0xFFFFFFF || val > 0xFFFFFFF) {
            var low = val & 0xFFFFFFF;
            var lowbit = bit & 0xFFFFFFF;
            val /= 0x10000000;
            bit /= 0x10000000;
            return (val | bit) * 0x10000000 + (low | lowbit);
        }
        return (val | bit);
    }

乾杯、ジェイソン

于 2014-04-03T13:23:12.260 に答える
0

問題なのはブラウザではなく、言語仕様です。要するに.. 論理ビット演算子 &, | などはすべて、オペランドを 32 ビット整数として扱います。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

64 ビット幅の操作を行うには、ライブラリに依存するか、独自の関数を作成する必要があります。

于 2014-01-27T17:07:27.777 に答える