微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python中利用bytearray的每一位?

如何解决如何在python中利用bytearray的每一位?

所以我有一个这样的字节数组:

a=bytearray([False]*size)

我想将错误值存储在字节数组中,而不是一个字节,而是一个字节,我关心内存,无论如何我可以这样做吗?因为使用 8 位来存储 1 位值似乎是一种浪费。我也不能使用 bitarray 导入。我现在已经花了几个小时来解决这个问题,因此非常感谢您的帮助。

解决方法

这是一个简单的类,可以做你想做的事。它在 bytearray 类型之上实现位数组:

class BitArray:
    def __init__(self,size):
        self.size = size
        self.bytearray = bytearray((size + 7) >> 3)

    def clear(self):
        ba = self.bytearray
        for i in range(len(ba)):
            ba[i] = 0

    def get_bit(self,bit_ix):
        if not isinstance(bit_ix,int):
            raise IndexError("bit array index not an int")

        if bit_ix < 0 or bit_ix >= self.size:
            raise IndexError("bit array index out of range")

        byte_ix = bit_ix >> 3
        bit_ix = bit_ix & 7
        return (self.bytearray[byte_ix] >> bit_ix) & 1

    def set_bit(self,bit_ix,val):
        if not isinstance(bit_ix,int):
            raise IndexError("bit array index not an int")

        if bit_ix < 0 or bit_ix >= self.size:
            raise IndexError("bit array index out of range")

        if not isinstance(val,int):
            raise ValueError("bit array value not an int")

        if val not in (0,1):
            raise ValueError("bit array value must be 0 or 1")

        byte_ix = bit_ix >> 3
        bit_ix = bit_ix & 7
        bit_val = 1 << bit_ix

        if val:
            self.bytearray[byte_ix] |= bit_val
        else:
            self.bytearray[byte_ix] &= ~bit_val

    def __getitem__(self,key):
        return self.get_bit(key)

    def __setitem__(self,key,value):
        self.set_bit(key,value)

位数组在创建时最初全为零。 clear 方法将所有位设置为零,get_bit 方法将返回一个位的值,而 set_bit 方法将设置一个位的值。所有位值都是 01(尽管您可以轻松地将其更改为 TrueFalse)。

以下是如何使用它的示例:

ba = BitArray(23)
print(ba.get_bit(17))

ba.set_bit(17,1)
print(ba.get_bit(17))

ba.clear()
print(ba.get_bit(17))

这会创建一个足以容纳 23 位的位数组。然后打印第 17 位,即 0。然后将第 17 位设置为 1 并打印它。然后清除整个数组并再次打印第 17 位。输出为:

0
1
0

更新:我添加了 __getitem____setitem__,因此您现在可以使用索引符号直接索引单个位。示例:

ba[17] = 1
print(ba[17])

这将位 17 设置为 1,然后打印它。输出为:

1

注意索引必须是整数。不支持切片。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。