我正在尝试在Python中实现快速二进制幂运算。我想知道整数的二进制表示返回 1 的情况。也许通过示例更容易理解:
bin(13) # returns 1101 because one 8 + one 4 + one 1 = 13.
如何编写一个函数,通过将二进制数作为参数传递,返回8、4和1?如您所见,我并不是在明确地寻求2的幂,而是试图得到能够将这些幂相乘的最简表示。
我正在尝试在Python中实现快速二进制幂运算。我想知道整数的二进制表示返回 1 的情况。也许通过示例更容易理解:
bin(13) # returns 1101 because one 8 + one 4 + one 1 = 13.
这个问题有点令人困惑(请看我的评论),但我还是想分享一个解决方案,因为目前被接受的答案对我来说很难理解。出于好奇心,明天我可能会比较和基准化一堆不同的解决方案。
bin_num = bin(13)
def bin_str_decomp(bin_num_str):
bin_clean = bin_num_str[:1:-1]
return [1 << idx for idx, bit in enumerate(bin_clean) if bit == '1']
print(bin_str_decomp(bin_num))
你可以按照以下方式进行操作:
# Split the binary and grab interested part, and its size.
# >> bin(123456789) == "0b111010110111100110100010101"
binary = bin(123456789)[2:]
size = len(binary)
numbers = []
for i in range(size):
# Checks to see if the binary[i] is not equals to zero.
if binary[i] is not "0":
# Indexes the `binary` string and adds (size - i - 1) zeros to the end of it.
number = int(binary[i] + "0" * (size - i - 1), 2)
numbers.append(number)
print(numbers)
# >> [67108864, 33554432, 16777216, 4194304, 1048576, 524288, 131072, 65536, 32768, 16384, 2048, 1024, 256, 16, 4, 1]
binary = bin(13)[2:]
nums = [
int(binary[i] + "0" * (len(binary) - i - 1), 2)
for i in range(len(binary))
if binary[i] is not "0"
]
return nums
以下是单行解决方案,仅出于好奇。
print((lambda binary: [int(binary[i] + "0" * (len(binary) - i - 1), 2) for i in range(len(binary)) if binary[i] is not "0"])(binary = bin(123456789)[2:]))
for(int bit = 1; bit; bit <<= 1)if(number&bit){ /*将位的值附加到数组、字符串或其他*/}
的操作,将int替换为数字的任何类型。因此,如果您知道如何在Python中表达它,那就可以了。 - Jason CbitValues[number]
是给定数字的值数组。但是,如果number
是 8 位,则只有这种方法是可行的。如果它是 16 位,则由于表的大小,您可能会遇到缓存未命中问题,但您只需进行测试即可。如果是 32 或 64 位,则表太大了,尽管我想您可以将其分成 4/8 个 8 位块。 - Jason Cbin()
,它只是一个数字的二进制字符串表示?我猜你可能是为了学习而这样做的? - AMC