Лучший способ усечь двоичное число - PullRequest
1 голос
/ 23 октября 2019

Предполагается, что последние k биты числа произвольного размера n будут установлены в ноль. Например, если бы я хотел укоротить 0b10011101 на 3, результат был бы 0b10011000.

. Я подумал о нескольких возможных решениях, таких как использование сдвигов и других бинарных операторов или даже манипулирование строками. ,Два из них следующие:

def truncate_bin_shift(n, k):
    return n >> k << k
def truncate_bin_and(n, k):
    return n & ((1<<n.bit_length()-k)-1 << k)

Мой любимый - сдвиг вперед и назад, учитывая, насколько он чист, но мне интересно, есть ли другая альтернатива, которая могла бы быть значительно более эффективнойдля больших значений n.

Вопрос заключается в том, можно ли считать какой-либо из них эффективным и подходящим (читай питонским) способом для его достижения.

Если нет, то что будетлучше и почему?

1 Ответ

2 голосов
/ 23 октября 2019

Вы также можете сделать:

def truncate_bin_shift(n, k):
    return n & -1 << k

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

...