gpt4 book ai didi

python - Python 中的位掩码

转载 作者:太空狗 更新时间:2023-10-29 21:15:42 26 4
gpt4 key购买 nike

我有一个字节(来自其他供应商),其中潜在的位掩码如下:

值 1 = 0x01值 2 = 0x02值 3 = 0x03值 4 = 0x04值 5 = 0x05值 6 = 0x06值 7 = 0x40值 8 = 0x80

我可以指望 value1 到 value6 中的一个存在。然后可能会或可能不会设置 value7。 value8 可以设置也可以不设置。

所以这是合法的:value2 |值7 |值(value)8这是不合法的:value1 |值3 |值7

我需要弄清楚是否设置了值 7,是否设置了值 8,以及剩余的值是多少。

我有以下 python 代码。有没有更优雅的方法来做到这一点?

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

编辑 - 我喜欢 stackoverflow。这么多有用的答案,这么快!你们真棒!希望我能标记所有答案。但我至少会给每个人投赞成票!

EDIT2 - 根据以下答案,代码简化为:

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()

最佳答案

大多数 value* 常量实际上不是位掩码,只有 value7value8 是。我会定义另一个位掩码来提取较低的位,所以我总共有三个位掩码:

mask0 = 0x07
mask1 = 0x40
mask2 = 0x80

现在你的函数变成了

def parse_byte(byte):
return byte & mask2, byte & mask1, byte & mask0

我没有将结果转换为 bool——我不明白为什么有必要这样做。当使用 if 检查返回值时,它无论如何都会被隐式转换为 bool

还要注意

format(value,'b').zfill(8)

可以简化为

format(value,'08b')

关于python - Python 中的位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8508799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com