预期结果是将任意大小k
的最后n
位设置为零。例如,如果我想将0b10011101
截断3,结果将是0b10011000
。
我想到了一些可能的解决方案,例如使用shift和其他二进制运算符,甚至是字符串操作。其中两个如下:
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
值可以显着提高效率。
问题是,是否可以将其中任何一种视为完成任务的有效且适当的方式(读取pythonic)。
如果没有,什么是更好的方法,为什么?
答案 0 :(得分:2)
您也可以这样做:
def truncate_bin_shift(n, k):
return n & -1 << k
我个人更喜欢它,因为它仅使用每个参数一次,并使用&
来掩盖这些位,这通常是执行截断(重置位)的方式。