32 비트 부호없는 정수의 비트를 반전하는 것은 Java에 사용되는 부호없는 정수가 아니기 때문에 발생합니다.32 비트 부호없는 정수의 역 비트
내 코드에는 두 가지 버전이 있습니다. 나는이 문제가 :
(1) 제 1 차 및 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;
}
감사! 두 숫자 비트 (31)의 동일한 비트 패턴에 곱 때문에
ithBit * (1 << (numBits - i - 1));
가 (32)가 설정되고 : 두 버전의
FWIW 부호없는 32 비트 정수를 32 비트 부호있는 정수로 유지하는 것은 완전히 합법적입니다. 맞는 것입니다. 소위 "부호 비트 (sign bit)"는 여러분이 방금 사용할 수있는 정상적인 비트입니다. – harold