Ich habe den folgenden Java-Code:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Das Ergebnis ist 254 beim Drucken, aber ich habe keine Ahnung, wie dieser Code funktioniert. Wenn der &
Operator einfach bitweise ist, warum führt er dann nicht zu einem Byte und stattdessen zu einer Ganzzahl?
java
integer
byte
bitwise-and
Dagronlund
quelle
quelle
byte value = (byte) 0xfe;
Antworten:
Es wird
result
auf den (vorzeichenlosen) Wert gesetzt, der sich aus dem Setzen der 8 Bitsvalue
in die niedrigsten 8 Bits von ergibtresult
.Der Grund, warum so etwas notwendig ist,
byte
ist, dass es sich um einen signierten Typ in Java handelt. Wenn Sie gerade geschrieben haben:dann
result
würde mit dem Wertff ff ff fe
statt enden00 00 00 fe
. Eine weitere Feinheit ist, dass das&
so definiert ist, dass es nur mit denint
Werten 1 arbeitet. Was also passiert, ist:value
wird zu einemint
(ff ff ff fe
) befördert.0xff
ist einint
Literal (00 00 00 ff
).&
wird angewendet, um den gewünschten Wert für zu erhaltenresult
.(Der Punkt ist, dass die Konvertierung in
int
erfolgt, bevor der&
Operator angewendet wird.)1 Nun, nicht ganz. Der
&
Operator arbeitet auch mitlong
Werten, wenn einer der Operanden a istlong
. Aber nicht weiterbyte
. Siehe die Java-Sprachspezifikation, Abschnitte 15.22.1 und 5.6.2 .quelle
0x
(oder0X
) teilt Java mit, dass das folgende Ganzzahlliteral als hexadezimal interpretiert werden soll (Basis 16). Java unterstützt auch ein nacktes0
Präfix für Oktalliterale und ein0b
(oder0B
) Präfix für Binärliterale. Weitere Informationen zu Ganzzahlliteralen finden Sie in der Java-Sprachspezifikation .0x
oder0b
für sich (ohne Ziffern) in Java eine unzulässige Syntax ist.fe
im 8-Bit-Zweierkomplement entspricht dem Dezimalwert −2. Um den Wert beizubehalten,Integer.valueOf(byte)
müssteff ff ff fe
(−2 in 32-Bit, Zweierkomplement) erzeugt werden, nicht00 00 00 fe
(Dezimalwert 254). Diese Umwandlung (von einembyte
Wertfe
in einenint
Wertff ff ff fe
) wird als Vorzeichenerweiterung bezeichnet und ist Teil der Java-Sprachspezifikation. Der Zweck vonvalue & 0xff
besteht darin, die Vorzeichenerweiterung rückgängig zu machen (dh eine Nullerweiterung zu simulieren, etwas, das Java nicht hat).Von http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Das Hex-Literal 0xFF ist gleich int (255). Java repräsentiert int als 32 Bit. In Binärform sieht es so aus:
Wenn Sie ein bisschen weise UND mit diesem Wert (255) für eine beliebige Zahl ausführen, werden alle bis auf die niedrigsten 8 Bits der Zahl maskiert (NULL gemacht) (wie sie sind).
& ist so etwas wie%, aber nicht wirklich .
Und warum 0xff? dies in ((Potenz von 2) - 1). Alle ((Potenz von 2) - 1) (z. B. 7, 255 ...) verhalten sich so etwas wie% Operator.
Dann ist
in binär 0 alle Nullen und 255 sieht folgendermaßen aus:
Und -1 sieht so aus
Wenn Sie ein bitweises UND von 0xFF und einen Wert von 0 bis 255 ausführen, entspricht das Ergebnis genau dem Wert. Und wenn ein Wert höher als 255 ist, liegt das Ergebnis immer noch zwischen 0 und 255.
Wenn Sie jedoch Folgendes tun:
du erhältst
00000000 00000000 00000000 11111111
, was NICHT dem ursprünglichen Wert von -1 entspricht (11111111
ist 255 in Dezimalzahl).Überprüfen Sie, ob ein bestimmtes Bit gesetzt ist (1) oder nicht (0)
Setze (1) ein bestimmtes Bit
Setzen Sie ein bestimmtes Bit zurück (0)
XOR
Beachten Sie nur, dass bei zweimaliger XOR-Operation derselbe Wert angezeigt wird.
Eine weitere Logik mit XOR ist
Das Obige ist nützlich, um zwei Variablen ohne Temperatur wie unten zu tauschen
ODER
quelle
Es hilft, viele Codes zu reduzieren. Es wird gelegentlich in RGB-Werten verwendet, die aus 8 Bit bestehen.
wobei 0xff 24 (0) und 8 (1) wie bedeutet
00000000 00000000 00000000 11111111
Dies tritt am häufigsten in Fällen auf, in denen versucht wird, Farbwerte von einem speziellen Format in Standard-RGB-Werte (die 8 Bit lang sind) umzuwandeln.
Tolle Erklärung Siehe hier
quelle
In 32 - Bit - Format System der hexadezimale Wert
0xff
repräsentiert00000000000000000000000011111111
das ist255(15*16^1+15*16^0)
in dezimal. und der bitweise & Operator maskiert die gleichen 8 Bits ganz rechts wie im ersten Operanden.quelle