Forum: PC-Programmierung python: check bits


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Zo R. (hsch1978)


Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich möchte prüfen, ob nur bit 4 oder 5 besetzt wurde.
=> 0x08, 0x10

Wie kann dies in python für einen Test umgesetzt werden?
1
value = 0x04
2
(value & (1<<2)) != 0 # check bit 3

: Bearbeitet durch User
von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

def is_bit_set(byte, bit_position):
    return (byte & (1 << bit_position)) != 0

# Test
byte_value = 0b10101010
bit_position_to_check = 3

if is_bit_set(byte_value, bit_position_to_check):
    print(f"Das Bit an Position {bit_position_to_check} im Byte 
{byte_value:b} ist gesetzt.")
else:
    print(f"Das Bit an Position {bit_position_to_check} im Byte 
{byte_value:b} ist nicht gesetzt.")

von Zo R. (hsch1978)


Lesenswert?

Und die Kompination mit zwei bits?

von Harald K. (kirnbichler)


Lesenswert?

Zo R. schrieb:
> Kompination

Dann musst Du zwei Aufrufe "kompinieren". Mit einem logischen UND.

von Martin H. (horo)


Lesenswert?

Zo R. schrieb:
> Ich möchte prüfen, ob nur bit 4 oder 5 besetzt wurde.

Bit 4 oder Bit 5 oder beide? Oder nur beide zusammen?
Und die anderen Bits == 0 sind? Oder ist deren Zustand egal?

: Bearbeitet durch User
von Zo R. (hsch1978)


Lesenswert?

Bit 4 oder Bit 5 und Bit 4 und Bit 5.
Die anderen Bits sollten 0 sein.

von Sebastian W. (wangnick)


Lesenswert?

Zo R. schrieb:
> Und die Kompination mit zwei bits?

Wenn die Maske von Bit 4 0x80 ist, und die Maske von Bit 5 0x10, dann 
ist die gemeinsame Maske 0x18:
1
mask = 0x18
2
result = value & mask

Nach diesem Stück Quellcode steht in result 0x00, 0x08, 0x10 oder 0x18, 
je nachdem wie die beiden Bits in value gesetzt waren.

LG, Sebastian

von Harald K. (kirnbichler)


Lesenswert?

Zo R. schrieb:
> Bit 4 oder Bit 5 und Bit 4 und Bit 5.

Falls das ein logischer Audruck sein soll: Was bringt es, Bit 5 mit sich 
selbst zu verUNDen?

Bit4 || (Bit5 && Bit4 && Bit5)

Oder ist das Umgangssprache, und Du meinst was ganz anderes?

Ist "oder" ein umgangssprachliches oder logisches Oder?

von Sebastian W. (wangnick)


Lesenswert?

Sebastian W. schrieb:
> die Maske von Bit 4 0x80 ist, und

Typo, soll heißen "die Maske von Bit 4 0x08 ist, und" ...

LG, Sebastian

von Zo R. (hsch1978)


Lesenswert?

Sebastian W. schrieb:
> Zo R. schrieb:
>> Und die Kompination mit zwei bits?
>
> Wenn die Maske von Bit 4 0x80 ist, und die Maske von Bit 5 0x10, dann
> ist die gemeinsame Maske 0x18:
>
>
1
> mask = 0x18
2
> result = value & mask
3
>
>
> Nach diesem Stück Quellcode steht in result 0x00, 0x08, 0x10 oder 0x18,
> je nachdem wie die beiden Bits in value gesetzt waren.
>
> LG, Sebastian

Vielen Dank das ist es.

von Norbert (der_norbert)


Lesenswert?

Wenn du ein True/False Ergebnis erwartest:
1
#!python
2
value = 0xff
3
mask = 0x18
4
all_bits_set = True if (value & mask) == mask else False 
5
any_bit_set = True if value & mask else False 
6
no_bits_set = False if value & mask else True

von Zo R. (hsch1978)


Lesenswert?

Norbert schrieb:
> Wenn du ein True/False Ergebnis erwartest:
>
1
#!python
2
> value = 0xff
3
> mask = 0x18
4
> all_bits_set = True if (value & mask) == mask else False
5
> any_bit_set = True if value & mask else False
6
> no_bits_set = False if value & mask else True
7
>

Vielen Dank.

von Daniel A. (daniel-a)


Lesenswert?

1
exactly_one_bit_set = bool( value & mask and value & (value-1) )

value & (value-1) stellt sicher, das höchstens 1 bit in value gesetzt 
ist.
value & mask stellt sicher, das mindestens ein Bit der Maske gesetzt 
ist.
Zusammen heisst das als, das exakt 1 bit der Maske gesetzt ist, und kein 
anderes bit.

von Norbert (der_norbert)


Lesenswert?

Daniel A. schrieb:
> exactly_one_bit_set = bool( value & mask and value & (value-1) )

Sicher?
1
>>> value = 0x01
2
>>> mask = 0x0f
3
>>> bool( value & mask and value & (value-1) )
4
False
5
>>> mask = 0x01
6
>>> bool( value & mask and value & (value-1) )
7
False

von Daniel A. (daniel-a)


Lesenswert?

Ups, ich hatte ein "not" vergessen:
1
exactly_one_bit_set = bool( value & mask and not value & (value-1) )

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.