Forum: Compiler & IDEs Bit im String (Byte) prüfen


von flyingwolf (Gast)


Lesenswert?

Hi.
Ich suche nach einer eleganten Möglichkeit ein Bit in einem String zu
prüfen.
Der Hintergrund ist der, das im Statusbyte die Brauchbarkeit des
Strings verschlüsselt ist, d.h. ist Bit 2 im 15. Zeichen 0 ist der
String unbrauchbar.
Bei 7 relevanten Bit bleiben da immerhin einige Möglichkeiten.
Gibt es da etwas besseres, als
If(timestring[15] == 0x02 || timestring[15] == 0x03 || timestring[15]
== 0x06 || timestring[15] == 0x07 ....

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das lässt sich mit einem logischen UND lösen:

  if (!(timestring[15] & 4))
  {
    // ungültig
  }


4 ist der numerische Wert von Bit 2 (angenommen, daß richtig gezählt
wird).

von Rolf Magnus (Gast)


Lesenswert?

Für rechenfaule geht auch (1 << 2) :-)

von flyingwolf (Gast)


Lesenswert?

@Rufus
Was Du schreibst ist sicher richtig, aber ich verstehe es nicht ganz
1. Logisch UND habe ich immer als && geschrieben. Mache ich was
falsch?
2. Wenn ich etwas mit 4 via und verknüpfe, was kommt dann dabei raus?
Ich würde jetzt denken, dass nur dann True rauskommt, wenn mein
Verknüpfungsparter == 4 ist?!
OK in menem Fall wäre es 2 weil ich bit0 als 1. Bit gezählt habe, aber
das ist im Endeffekt ja unerheblich

@Rolf
etwas wie :
If(timestring[15] == timestring[15] |= (1 << 2))
??

von noname (Gast)


Lesenswert?

gemeint war nicht logisches sondern bitweises oder.

also zb:
0b10011010 &
0b00110000 =
0b00010000

dh, da wo an beiden stellen ne 1 ist, kommt ne 1 raus. benutzt man
gerne zum "maskieren" von bits. also genau das, was du willst...

von Rolf Magnus (Gast)


Lesenswert?

> 1. Logisch UND habe ich immer als && geschrieben. Mache ich was
> falsch?

Du willst kein logisches Und, sondern ein bitweises. Bei ersterem wird
der ganze Wert als logisch falsch angesehen, wenn er 0 ist, als wahr,
wenn er 1 ist. Bei letzterem wird jedes Bit einzeln verknüpft.

> 2. Wenn ich etwas mit 4 via und verknüpfe, was kommt dann dabei
> raus?

4 wenn das entsprechende Bit in dem "etwas" gestetzt ist, sonst 0.

> @Rolf
> etwas wie :
> If(timestring[15] == timestring[15] |= (1 << 2))
> ??

Nein, eher:

if(timestring[15] & (1 << 2))

von noname (Gast)


Lesenswert?

meine natuerlich bitweises und...

ach ja:
1<<0 = 0b00000001
1<<1 = 0b00000010
1<<2 = 0b00000100
3<<4 = 0b00110000
usw..

quasi "schieben" auf bitebene...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.