2

これが私の問題です:

私はバイナリ値を持っています

101001

そしてマスク

011100

それらを比較して、結果を整数として取得したいと思います。この場合、次のようになります。

 1 **010** 01
 0 **111** 00

= 010 => 2

私の最初のアイデアは、文字配列を扱うことです。しかし、Javaでこの目的を達成するためのより良い方法があるかどうか知りたいですか?

4

3 に答える 3

3

それらを比較して、結果を整数として取得したい

「比較」ではなく「マスク」を意味していると仮定します。

int result = 0B011100 & 0B011100;

文字配列は必要ありません。

これはかなり些細なことです。

于 2012-09-18T08:57:09.787 に答える
1

次のように、1 つのビットを分割できるマスクを使用できるようにアルゴリズムを改善しました。

00111011011

マスクとマスクされた値から値を取得する関数は次のとおりです

 private static long getMaskedValue(long maskedValue, long mask){
        long definitiveMaskedValue = 0;
        int count=0;

        maskedValue = mask & maskedValue;

        while (mask != 0){
            while ((mask & 1) == 0){
                mask = mask >>> 1;
                maskedValue = maskedValue >>> 1;
            }
            while ((mask & 1) == 1){
                definitiveMaskedValue = definitiveMaskedValue + ((maskedValue & 1) << count);
                count++;

                mask = mask >>> 1;
                maskedValue = maskedValue >>> 1;
            }
        }

        return definitiveMaskedValue;
    }

これは、ビットマスクのおかげで変数に値を格納する関数です。値が内部に格納された古い変数を返します。Java ではシフト演算子が 32 ビットを超えて左にシフトできないため、BigInteger を使用する必要がありました。

private static long setMaskedValue (long maskedValue, long mask, long valueToAdd) {
            int nbZero=0;
            int nbLeastSignificantBit=0;
            long tmpMask=mask;
            maskedValue = maskedValue & ~mask;

            while (tmpMask != 0){
                while ((tmpMask & 1) == 0){
                    tmpMask = tmpMask >>> 1;
                    nbLeastSignificantBit++;
                    nbZero ++;
                }

                while ((tmpMask & 1) == 1){
                    tmpMask = tmpMask >>> 1;

                    BigInteger bigValueToAdd = BigInteger.valueOf(valueToAdd).shiftLeft(nbZero);
                    long tmpValueToAdd = bigValueToAdd.longValue();
                    BigInteger bigMaskOneBit = BigInteger.valueOf(1).shiftLeft(nbLeastSignificantBit);
                    long maskOneBit = bigMaskOneBit.longValue();

                    long bitValueToSet = getMaskedValue(tmpValueToAdd, maskOneBit);
                    maskedValue = maskedValue | bitValueToSet << nbLeastSignificantBit;
                    nbLeastSignificantBit++;
                }
            }
        return maskedValue;
    }
于 2012-12-17T09:11:35.410 に答える
0

もちろん。

  1. あなたは最初にあなたのビットが必要です。
  2. 右にシフトして、マスクの右側にあるゼロを回避します。

すでに整数として値が必要です。

次に、AND を実行します。int masked = value & mask;

次に、マスクの最初の 1 まで右にシフトします。

while (mask % 2 == 0) {
   mask = mask >>> 1;
   masked = masked >>> 1;
}

必要に応じて使用できwhile (mask & 1 == 0) {ます:)


& is bitwise AND.
| is bitwise OR.
^ is bitwise XOR (if my memory doesn't fail :).
>>> is shifting right (unsigned integer)
于 2012-09-18T08:59:18.923 に答える