問題は32ビット符号なし整数のビットを反転することです(Javaは符号なし整数を使用しないため)。32ビット符号なし整数の逆ビット
私のコードには2つのバージョンがあります。私は2つの懸念を持っている:
(1)私の第一及び第二ソリューションは、(正しいかどうか)と同じ値を返さない理由
(2)私の第一及び第二ソリューションは正しいが届かないで間違っていたところしかし、正しい答えを返し
//reverse(3) return 4294967296
public static long reverse(long a) {
long numBits = 32L;
long finalResult = 0L;
for(long i = 0L; i < numBits; i++){
long ithBit = a & (1L << i);
finalResult = finalResult + ithBit * (1L << (numBits - i - 1L));
}
return finalResult;
}
このコード(溶液):
//reverse(3) returns 0
public static long reverse(long a) {
long numBits = 32;
long finalResult = 0;
for(int i = 0; i < numBits; i++){
long ithBit = a & (1 << i);
finalResult = finalResult + ithBit * (1 << (numBits - i - 1));
}
return finalResult;
}
セカンドバージョンに答える
//reverse(3) returns 3221225472
public static long reverse(long A) {
long rev = 0;
for (int i = 0; i < 32; i++) {
rev <<= 1;
if ((A & (1 << i)) != 0)
rev |= 1;
}
return rev;
}
ありがとうございます! 2つの数字はビット31の同じビットパターン(第32回)というセットに掛けるため
ithBit * (1 << (numBits - i - 1));
:あなたがここにロジックの問題を抱えているの両方のバージョンで
FWIW 32ビット符号付き整数の32ビット符号なし整数を完全に正当化することは完全に正当です。それは収まるでしょう。いわゆる「符号ビット」は、ちょうど使用できる通常のビットです。 – harold