Setzen Sie ein bestimmtes Bit in Byte

78

Ich versuche, Bits in Java-Byte-Variablen zu setzen. Es bietet geeignete Methoden wie .setBit(i). Weiß jemand, wie ich das realisieren kann?

Ich kann bitweise durch ein bestimmtes Byte iterieren:

if( (my_byte & (1 << i)) == 0 ){

}

Ich kann diese Position jedoch nicht auf 1 oder 0 setzen, oder?

Wishi
quelle
@phuclv Das ist eine C / C ++ - Frage, keine Java-Frage.
Mark Rotteveel
@MarkRotteveel wird die gleiche Syntax verwendet. In der Tat sollte das Tag in etwas wie C-like umbenannt werden
phuclv
@phuclv Die Tatsache, dass dieselbe Syntax verwendet wird, ist meiner Meinung nach kein ausreichender Grund, um als Duplikat zu schließen.
Mark Rotteveel

Antworten:

142

Verwenden Sie die bitweisen Operatoren OR ( |) und AND ( &). So stellen Sie ein wenig, nämlich drehen das Bit an , posum 1:

my_byte = my_byte | (1 << pos);   // longer version, or
my_byte |= 1 << pos;              // shorthand

So setzen Sie ein wenig ab oder wenden sich an 0:

my_byte = my_byte & ~(1 << pos);  // longer version, or
my_byte &= ~(1 << pos);           // shorthand

Beispiele finden Sie unter Erweiterte Java / Bitweise Operatoren

driis
quelle
3
siehe auch den xor-Operator - es ist das dritte Elektrowerkzeug in diesem Arsenal (siehe den Wikipedia-Artikel über Maskierung).
Hardryv
Beeindruckend. Das ist eigentlich grundlegendes Informatik-Zeug, aber es hat mich immer noch umgehauen, die binäre Welt ist großartig
Elliotching
66

Um ein bisschen zu setzen:

myByte |= 1 << bit;

Um es zu klären:

myByte &= ~(1 << bit);
Jon Skeet
quelle
1
Was meinst du damit, das würde ein bisschen "setzen"? Angenommen, Sie haben versucht, auf das 0. Bit zuzugreifen, und myByte enthält 11101101. Was bedeutet das? Wie steuere ich den eingestellten Wert?
Michael
6
@ Michael: Ein bisschen setzen bedeutet, es zu machen 1. Ein bisschen zu löschen bedeutet, es zu machen 0.
Jon Skeet
26

Nur um Jons Antwort und Driis 'Antwort zu ergänzen

Umschalten (invertieren)

    myByte ^= 1 << bit;
user85421
quelle
1
@ernesto, aber es beantwortet die Frage nicht speziell. Er fragte, wie man das Bit setzt, nicht umschaltet. Da ist ein Unterschied. Natürlich können Sie das Bit zuerst überprüfen und dann bei Bedarf umschalten, aber das wären auch zwei separate Aufgaben ...
Justin Smith
12

Die Technik, die Sie benötigen, besteht darin, das ausgewählte Bit zu isolieren und es entweder zu setzen oder zu löschen. Sie haben bereits den Ausdruck, um das Bit zu isolieren, da Sie es oben zum Testen verwenden. Sie können das Bit durch ODER-Verknüpfung setzen oder das Bit durch bitweises UND mit dem 1-Komplement des Bits löschen.

boolean setBit;
my_byte = setBit
          ? myByte | (1 << i)
          : myByte & ~(1 << i);
Jeffrey Hantin
quelle
8

Bitte sehen Sie sich die Klasse java.util.BitSet an, die die Arbeit für Sie erledigt.

Zum Set: myByte.set(bit); zurück: myByte.clear(bit); Um mit einem Bool zu füllen: myByte.set(bit, b); das Bool zu erhalten: b = myByte.get(bit); Holen Sie sich das Bitmap:byte bitMap = myByte.toByteArray()[0];

sebyku
quelle
3
Vorsicht mit Bitset. Es gibt keinen Unterschied zwischen dem Setzen eines Bits auf 0 und dem Löschen, daher length()würden die auf 0 gesetzten Bits nicht gezählt
Alex