Python 将位转换为字节序列
给定一个大小在4位以内的Python整数,如何将其转换为一个大小在4字节以内的整数(使用逐位算术而不是字符串处理),原始数据中的每一位对应一个字节,该字节重复8次 例如: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
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小时前编辑
链接。