Как получить числа, где двоичное представление равно 1? - PullRequest
3 голосов
/ 03 ноября 2019

Я пытаюсь реализовать быстрое двоичное возведение в степень в python. Я хочу знать целые числа, которые возвращает двоичное представление числа 1. Может быть, пример будет более понятным:

bin(13) # returns 1101 because one 8 + one 4 + one 1 = 13. 

Как я могу построить функцию, которая возвращает 8,4,1, передавая двоичное число какАргумент? Как видите, я явно не пытаюсь получить степени 2, а минималистское представление для умножения степеней вместе.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Этот вопрос немного озадачивает (см. Мой комментарий), но я все равно хотел поделиться решением, потому что принятый в настоящее время ответ кажется мне непонятным. Ради любопытства завтра я могу сравнить и сравнить множество различных решений.

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))
1 голос
/ 03 ноября 2019

Вы могли бы сделать что-то в одиночку с этими строками:

# 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:]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...