Das Problem besteht darin, die Bits einer 32-Bit-Ganzzahl ohne Vorzeichen umzukehren (da Java keine vorzeichenlosen Ganzzahlen hat, die wir lange verwenden).Reverse-Bits einer 32-Bit-Ganzzahl ohne Vorzeichen
Hier sind zwei Versionen meines Codes. Ich habe zwei Bedenken:
(1), warum meine 1. und 2. Lösung nicht zurück den gleichen Wert (richtig oder nicht)
(2), wo meine erste und zweite Lösung schief gelaufen ist nicht die richtige bekommen Antwort
//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;
}
Zweite Version:
//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;
}
Dieser Code (die Lösung) gibt die richtige Antwort, aber:
//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;
}
Danke!
FWIW es ist völlig legitim, eine vorzeichenlose 32-Bit-Ganzzahl in einer 32-Bit-Ganzzahl mit Vorzeichen zu behalten. Es wird passen. Das sogenannte "Zeichen-Bit" ist ein normales Bit, das Sie einfach verwenden können. – harold