2

ビット 101 と 110 があります。01 と 10 のような最初のビットを無視して、ビットごとの演算子を使用して比較したいと思います。

例:

I have:
101
110
===
01 & 10 <- How I want to consider
x00 <- The result I want

また

10110
11011
=====
0110 & 1011 <- How I want to consider
x0010 <- The result I want

Javaでビット単位の演算子を使用してこれを達成するにはどうすればよいですか?

詳細:

  • 最初のビットは常に 1 です。
  • 他のビットは可変です。比較の両側のビット数は同じになります。
  • 他のビットを考慮して最初のビットを無視して比較を行う方法を検出したいと思います。

使用事例:

  • 私は2つの許可値を持っています。1 つ目は 5/101 (必要な許可) で、2 つ目は 6/110 (ユーザーが持っている許可) です。
  • 常に 1 になる最初のブロックを除いて、システム内の特定の許可規則を表す 3 番目のブロックを (ビット単位で) 比較したいと考えています。
  • 「必要な許可」ビットマスクは次のことを意味します。
    • 1- 左パディングゼロを考慮できるようにするために使用する常に固定の値 (これを達成する別の方法がない限り)。
    • 0- この比較には役に立たない別のパーミッション ルール (パーミッション 1 と呼びましょう)。
    • 1- 現在のパーミッション ルールに必要なパーミッション (パーミッション 2 を呼び出しましょう)。
  • 「ユーザーが持つ権限」とは、次のことを意味します。
    • 1- ストライプアウトする固定値。
    • 1- 権限 1 のユーザーの値を表します。
    • 0- パーミッション 2 のユーザーの値を表します。パーミッション 2 の値は 1 ですが、ユーザーの値が 0 の場合、必要なアクションは許可されません。反対に、アクションの実行が許可されます。

この場合のより良い解決策も正解と見なされます。

4

3 に答える 3

3

有効なビット数がわかっている場合 (例: numofbits = 5)、式のビットマスクは次のようになります。

bitmask = (1 << numofbits) - 1

がわからない場合はnumofbits、 でループを作成し、 にnum = num >> 1なるまで繰り返しを数えますnum == 0

ユースケースの場合:

result = (req_roles & user_roles) & (bitmask >> 1)

これは単にand役割ビットであり、ans は上位ビット (常に 1) を切り捨てます。


前の質問に対する前の回答:) :

最大数のビットマスク (例: bitmask = 0x1f (11111ビット数)) がわかっている場合は、次の式の結果が必要です。

result = (a ^ b) ^ (bitmask >> 1)

それは何をするためのものか?

  • すべてのビットを比較し、等しいビットは 0 になります
  • すべての下位ビットを元に戻すため、等しいビットは 1 になります (上位ビットを除外するため、0 のままになります)
于 2013-02-18T01:38:23.347 に答える
3

011 & argたとえば、それらを比較する前に、最初のビットがオフになっているマスクで引数を「and」します。

編集:質問を言い直した後。

代わりに、役割ベースのアクセス許可を使用することもできます。これらは、ブール型のアクセス許可文字列よりもはるかに柔軟で理解しやすいものです。それらは自己文書化でもあります。ビット文字列ベースのパーミッションは、1980 年代初頭に Unix が開発されたときや組み込みシステムのように、メモリやディスク容量が限られている場合を除き、めったに使用されません。

于 2013-02-18T00:54:13.547 に答える
1

これを試して:

// tester 1
int x, y, z, mask;
x = 0x05; // 101
y = 0x06; // 110
mask = getMask(x, y);
z = (mask & (x & y));
System.out.println(String.format("mask: %x result: %x", mask, z));

// tester 2    
int x, y, z, mask;
x = 0x16; // 10110
y = 0x1B; // 11011
mask = getMask(x, y);
z = (mask & (x & y));
System.out.println(String.format("mask: %x result: %x", mask, z));

private int getMask(final int x, final int y) {
    int mask = findHighOrderOnBit(x, 0);
    mask = findHighOrderOnBit(y, mask) - 1;
    return mask;
}

private int findHighOrderOnBit(final int target, final int otherMask) {
    int result = 0x8000;
    for (int x = 0; x != 16; x++) {
        if ((result & target) > 0)
            break;
        result >>= 1;
    }
    if (otherMask > result)
        result = otherMask;
    return result;
}
于 2013-02-18T01:50:07.100 に答える