Python 将位转换为字节序列

Python 将位转换为字节序列,python,bit-manipulation,Python,Bit Manipulation,给定一个大小在4位以内的Python整数,如何将其转换为一个大小在4字节以内的整数(使用逐位算术而不是字符串处理),原始数据中的每一位对应一个字节,该字节重复8次 例如:0b1011应该变成0b111111110000000011111111111111我只需要做一个循环: x = 0b1011 y = 0 for i in range(4): if x & (1 << i): y |= (255 << (i * 8)) print "%x

给定一个大小在4位以内的Python整数,如何将其转换为一个大小在4字节以内的整数(使用逐位算术而不是字符串处理),原始数据中的每一位对应一个字节,该字节重复8次

例如:
0b1011
应该变成
0b111111110000000011111111111111

我只需要做一个循环:

x = 0b1011
y = 0
for i in range(4):
    if x & (1 << i):
        y |= (255 << (i * 8))
print "%x" % y
x=0b1011
y=0
对于范围(4)中的i:
如果x&(1我只做一个循环:

x = 0b1011
y = 0
for i in range(4):
    if x & (1 << i):
        y |= (255 << (i * 8))
print "%x" % y
x=0b1011
y=0
对于范围(4)中的i:

如果x&(1向ncoghlan道歉:

expanded_bits = [
    0b00000000000000000000000000000000,
    0b00000000000000000000000011111111,
    0b00000000000000001111111100000000,
    0b00000000000000001111111111111111,
    0b00000000111111110000000000000000,
    0b00000000111111110000000011111111,
    0b00000000111111111111111100000000,
    0b00000000111111111111111111111111,
    0b11111111000000000000000000000000,
    0b11111111000000000000000011111111,
    0b11111111000000001111111100000000,
    0b11111111000000001111111111111111,
    0b11111111111111110000000000000000,
    0b11111111111111110000000011111111,
    0b11111111111111111111111100000000,
    0b11111111111111111111111111111111,
    ]
然后,只需使用要转换的半字节索引此列表:

>>> bin(expanded_bits[0b1011])
"0b11111111000000001111111111111111"

向ncoghlan致歉:

expanded_bits = [
    0b00000000000000000000000000000000,
    0b00000000000000000000000011111111,
    0b00000000000000001111111100000000,
    0b00000000000000001111111111111111,
    0b00000000111111110000000000000000,
    0b00000000111111110000000011111111,
    0b00000000111111111111111100000000,
    0b00000000111111111111111111111111,
    0b11111111000000000000000000000000,
    0b11111111000000000000000011111111,
    0b11111111000000001111111100000000,
    0b11111111000000001111111111111111,
    0b11111111111111110000000000000000,
    0b11111111111111110000000011111111,
    0b11111111111111111111111100000000,
    0b11111111111111111111111111111111,
    ]
然后,只需使用要转换的半字节索引此列表:

>>> bin(expanded_bits[0b1011])
"0b11111111000000001111111111111111"

以下递归解决方案仅使用加法、左/右移位运算符和带整数的按位&运算符:

def xform_rec(n):
    if n == 0:
        return 0
    else:
        if 0 == n & 0b1:
            return xform_rec(n >> 1) << 8
        else:
            return 0b11111111 + (xform_rec(n >> 1) << 8)

以下递归解决方案仅使用加法、左/右移位运算符和带整数的按位&运算符:

def xform_rec(n):
    if n == 0:
        return 0
    else:
        if 0 == n & 0b1:
            return xform_rec(n >> 1) << 8
        else:
            return 0b11111111 + (xform_rec(n >> 1) << 8)

做过一次之后,我会将结果缓存在一个16项的查找表中。做过一次之后,我会将结果缓存在一个16项的查找表中。@John Machin--好的,当然。但我明白了,为什么?@senderle表查找速度要快得多。@Keith,我在John Machin编辑之前做的是不是一个查找表?@senderle我不知道为什么你以前有过。也许我现在正跳到某个问题的中间?现在我仔细看了一下,我想我回答了错误的问题。@senderle:空格越少,效果越好。你可以通过单击1小时前编辑的
链接来查看以前的版本。@John Machin--好的,当然。但我明白了,为什么?@senderle table lookups都快多了。@Keith,我在John Machin的编辑之前拥有的不是一个查找表吗?@senderle我不知道你以前拥有什么。也许我在这里跳到了中间?现在我仔细看看,我想我回答了一个错误的问题。@senderle:空白越少,效果越好。你可以通过单击
e来查看以前的版本1小时前编辑
链接。