これが私の問題です:
私はバイナリ値を持っています
101001
そしてマスク
011100
それらを比較して、結果を整数として取得したいと思います。この場合、次のようになります。
1 **010** 01
0 **111** 00
= 010 => 2
私の最初のアイデアは、文字配列を扱うことです。しかし、Javaでこの目的を達成するためのより良い方法があるかどうか知りたいですか?
これが私の問題です:
私はバイナリ値を持っています
101001
そしてマスク
011100
それらを比較して、結果を整数として取得したいと思います。この場合、次のようになります。
1 **010** 01
0 **111** 00
= 010 => 2
私の最初のアイデアは、文字配列を扱うことです。しかし、Javaでこの目的を達成するためのより良い方法があるかどうか知りたいですか?
それらを比較して、結果を整数として取得したい
「比較」ではなく「マスク」を意味していると仮定します。
int result = 0B011100 & 0B011100;
文字配列は必要ありません。
これはかなり些細なことです。
次のように、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;
}
もちろん。
すでに整数として値が必要です。
次に、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)