Tôi có một byte (từ một số nhà cung cấp khác), nơi các mặt nạ chút tiềm năng như sau:Bit mặt nạ bằng Python
value1 = 0x01 value2 = 0x02 value3 = 0x03 VALUE4 = 0x04 value5 = 0x05 value6 = 0x06 value7 = 0x40 value8 = 0x80
Tôi có thể đếm trên ONE giá trị1 đến giá trị6 hiện diện. Và sau đó value7 có thể hoặc không thể được thiết lập. value8 có thể hoặc không thể được đặt.
Vì vậy, điều này là hợp pháp: value2 | giá trị7 | value8 Điều này không hợp pháp: giá trị1 | giá trị3 | value7
Tôi cần tìm hiểu xem giá trị 7 có được đặt hay không, giá trị8 được đặt và giá trị còn lại là gì.
Tôi có mã python sau. Có cách nào thanh lịch hơn để làm điều này không?
value1 = 0x01
value2 = 0x02
value3 = 0x03
value4 = 0x04
value5 = 0x05
value6 = 0x06
value7 = 0x40
value8 = 0x80
def format_byte_as_bits(value):
return format(value,'b').zfill(8)
def mask_bits_on_byte(byte,mask):
inverse_of_mask = mask^0b11111111
return byte & inverse_of_mask
def parse_byte(byte):
value7_set = byte & value7 == value7
value8_set = byte & value8 == value8
byte = mask_bits_on_byte(byte,value7)
byte = mask_bits_on_byte(byte,value8)
base_value = byte
return value7_set,value8_set,base_value
# Example 1
byte = value3 | value7
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
print("value7_set = "+str(value7_set))
print("value8_set = "+str(value8_set))
print()
# Output:
# base_value = 3
# value7_set = True
# value8_set = False
# Example 2
byte = value5
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
print("value7_set = "+str(value7_set))
print("value8_set = "+str(value8_set))
print()
# Output:
# base_value = 5
# value7_set = False
# value8_set = False
# Example 3
byte = value1 | value7 | value8
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
print("value7_set = "+str(value7_set))
print("value8_set = "+str(value8_set))
# Output:
# base_value = 1
# value7_set = True
# value8_set = True
EDIT - I LOVE stackoverflow. Rất nhiều câu trả lời hữu ích, nhanh quá! Các bạn thật tuyệt vời! Ước gì tôi có thể đánh dấu tất cả các câu trả lời. Nhưng ít nhất tôi sẽ cho mọi người một cuộc bỏ phiếu!
EDIT2 - Dựa trên các câu trả lời dưới đây, các mã được đơn giản hóa như sau:
value1 = 0x01
value2 = 0x02
value3 = 0x03
value4 = 0x04
value5 = 0x05
value6 = 0x06
value7 = 0x40
value8 = 0x80
def parse_byte(byte):
return byte & value7, byte & 0x80, byte & 7
# Example 1
byte = value3 | value7
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
if value7_set: print("value7_set")
if value8_set: print("value8_set")
print()
# Example 2
byte = value5
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
if value7_set: print("value7_set")
if value8_set: print("value8_set")
print()
# Example 3
byte = value1 | value7 | value8
value7_set,value8_set,base_value = parse_byte(byte)
print("base_value = "+str(base_value))
if value7_set: print("value7_set")
if value8_set: print("value8_set")
print()
Rất gọn gàng và tôi đánh giá cao mẹo vặt trên bãi rác. Tôi sử dụng định dạng (giá trị, 'b'). Zfill (8) trên tất cả các nơi, bây giờ tôi chỉ có thể sử dụng định dạng (giá trị, '08b'). Cám ơn phản hồi của bạn! –
Một cách dễ dàng để tạo các bitmask phù hợp với mã dễ đọc là viết chúng như 'value1 = 1 << 0',' value2 = 1 << 1' (v.v.). Tức là, chỉ cần một chút và chỉ thay đổi ca làm việc. Lỗi rõ ràng hơn với chữ số thập phân hoặc thập phân. Nếu mặt nạ cần nhiều bit thiết lập, chỉ '|' những người cùng nhau (ví dụ, 'value3 = (1 << 2) | (1 << 3)' thay vì 'value3 = 0x0c'). – Kat