理解Python中的位操作函数

2024-04-25 21:44:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我真的需要一些帮助来理解这段代码:据我所知,它是在字节中间的字节数组中插入一个值,但是,由于我需要在Javascript中重新实现这一点,我想完全理解它。在

Array = [0] * 256
Bit_Offset = 0

[...]

def AddBits(byte_offset, bit_offset, bits, value):
    global Bit_Offset
    global Array

    for i in range(bits):
        if(value & 0x01):
            Array[(byte_offset + ((bit_offset + Bit_Offset + i)/ 8))] |= (0x01 << ((bit_offset + Bit_Offset + i) % 8));
        value /=2
    Bit_Offset += bits

它的用法是这样的:

^{pr2}$

编辑:好的,它确实在一个字节中的自定义偏移量处插入值,但在我看来这是一个非常糟糕的算法(真的,每一位都要插入一个循环?)。一定有更好的办法!在

我不太擅长二进制运算,但我想出了一个想法,即移动8 - bit_offset之类的值(以便第一个位在一个字节中处于正确的偏移量),如果它跨越多个字节,则将其拆分为若干部分,最后用数组中的字节对其进行ORing。这是对的吗?如何实现拆分部分?在


Tags: 代码字节valuedefbit数组bytejavascript
1条回答
网友
1楼 · 发布于 2024-04-25 21:44:25

我来复习一下位型运算符。在

if(value & 0x01):

这将检查最低有效位是1还是0。如果是零,我们什么都不做。在

^{pr2}$

因为数组中的所有值都是一个字节,所以byte_offset是我们要去的位置或位的索引。添加到字节偏移量中的是本地位计数器和全局位计数器的位的附加偏移量,这些位将被8除为字节。最后我们得到字节的索引,我们将把这个位放在哪里。在

^{3}$

这是在计算我们要去或的位位置。在

|= (0x01 << 

这取我们的位位置,把1移到那个位置,然后用任何已经存在的值来OR它。我们知道我们可以在这里使用1,因为if语句将过滤任何0

value /=2

这有效地将下一位放入LSB中,从而使位向右移动。(可替换为value >>=1

Bit_Offset += bits

最后,我们将添加到全局偏移量的位相加。在

它的作用

此函数在全局位偏移量、参数位偏移量和参数字节偏移量定义的位位置处获取数组(字节数组)和位操作数OR。它一次只执行一个位的原因是,您可能需要设置数组的多个索引(请尝试AddBits(3, 4, 8, 0xaa)并了解我的意思)。在

一个改进是将for循环改为:

for i in range(bits):
    Array[(byte_offset + ((bit_offset + Bit_Offset + i)/ 8))] |= ((value & 1) << ((bit_offset + Bit_Offset + i) % 8));
    value >>=1

编辑:你也可以这样一次只做一个字节

^{8}$

相关问题 更多 >