404 Stimmen

Deklaration eines unsigned int in Java

Gibt es eine Möglichkeit, einen unsigned int in Java zu deklarieren?

Die Frage kann aber auch so formuliert werden: Was ist die Java-Entsprechung von unsigned?

Um Ihnen den Kontext zu verdeutlichen, habe ich mir die Java-Implementierung von String.hashcode() . Ich wollte die Möglichkeit der Kollision zu testen, wenn die ganze Zahl 32 unsigned int waren.

5voto

Molossus Spondee Punkte 1008

Verwenden Sie char für 16-Bit-Ganzzahlen ohne Vorzeichen.

5voto

Jonathan Komar Punkte 2312

Hier gibt es gute Antworten, aber ich sehe keine Demonstrationen von bitweisen Operationen. Wie Visser (die derzeit akzeptierte Antwort) sagt, hat Java standardmäßig ganze Zahlen mit Vorzeichen (Java 8 hat ganze Zahlen ohne Vorzeichen, aber ich habe sie nie benutzt). Ohne Umschweife, los geht's...

RFC 868 Beispiel

Was passiert, wenn Sie eine ganze Zahl ohne Vorzeichen in IO schreiben müssen? Ein praktisches Beispiel ist, wenn Sie die Zeit gemäß RFC 868 . Dies erfordert eine vorzeichenlose 32-Bit-Ganzzahl (Big-Endian), die die Anzahl der Sekunden seit dem 1. Januar 1900 um 12:00 Uhr kodiert. Wie würden Sie dies kodieren?

Erstellen Sie Ihre eigene 32-Bit-Ganzzahl ohne Vorzeichen wie folgt:

Deklarieren Sie ein Byte-Array von 4 Bytes (32 Bits)

Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)

Dadurch wird das Array initialisiert, siehe Werden Byte-Arrays in Java mit Null initialisiert? . Jetzt müssen Sie jedes Byte im Array mit Informationen in der Big-Endian-Reihenfolge füllen (oder Little-Endian, wenn Sie Chaos anrichten wollen). Angenommen, Sie haben einen Long-Wert, der die Zeit enthält (Long-Integer sind in Java 64 Bit lang) und der secondsSince1900 (Die nur die ersten 32 Bits wert, und Sie haben die Tatsache, dass Datum 12:00 A.M. 1. Januar 1970 verweist behandelt), dann können Sie die logische UND verwenden, um Bits aus ihm zu extrahieren und verschieben Sie diese Bits in Positionen (Ziffern), die nicht ignoriert werden, wenn in ein Byte coersed, und in Big-Endian-Reihenfolge.

my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed

Unser my32BitUnsignedInteger entspricht nun einer vorzeichenlosen 32-Bit-Big-Endian-Ganzzahl, die dem RCF 868-Standard entspricht. Ja, der Datentyp long ist vorzeichenbehaftet, aber wir haben diese Tatsache ignoriert, weil wir davon ausgingen, dass secondsSince1900 nur die unteren 32 Bits verwendet). Da der Long in ein Byte umgewandelt wird, werden alle Bits höher als 2^7 (die ersten beiden Ziffern in Hexadezimal) ignoriert.

Referenzierte Quelle: Java Network Programming, 4. Auflage.

2voto

Carsten Semark Punkte 21

Es scheint, dass Sie das Problem der Unterschrift lösen können, indem Sie die Werte vor ihrer Verwendung mit einem "logischen UND" verknüpfen:

Beispiel (Wert von byte[] header[0] ist 0x86 ):

System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));

Ergebnis:

Integer -122 = 134

1voto

Romulo Punkte 21

Ich habe gerade dieses Stück Code erstellt, das "this.altura" von einer negativen in eine positive Zahl umwandelt. Hoffentlich hilft das jemandem in Not

       if(this.altura < 0){    

                        String aux = Integer.toString(this.altura);
                        char aux2[] = aux.toCharArray();
                        aux = "";
                        for(int con = 1; con < aux2.length; con++){
                            aux += aux2[con];
                        }
                        this.altura = Integer.parseInt(aux);
                        System.out.println("New Value: " + this.altura);
                    }

-28voto

kyo722 Punkte 1

Sie können die Funktion Math.abs(Zahl) verwenden. Sie gibt eine positive Zahl zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X