这种逐位操作是如何改变特定索引的单个位的



我了解每个单独的操作符自己做什么,但我不知道它们是如何交互以获得正确的结果的。

def kill(n, k):
#Takes int n and replaces the bit k from right with 0. Returns the new number
return n & ~(1<<k-1)

我用n为37,k为3对程序进行了测试。

def b(n,s=""):
print (str(format(n, 'b')) +" "+ s)
def kill(n, k):
b(n, "n ")
b(1<<k-1, "1<<k-1")
b(~(1<<k-1), "~(1<<k-1) ")
b( n & ~(1<<k-1)," n & ~(1<<k-1) ")
return n & ~(1<<k-1)

#TESTS
kill(37, 3)

我决定一步一步地完成它。我打印了n~(1<<k-1)的二进制表示,但在那之后我就迷路了。~(1<<k-1)给了我-101,我不知道如何在二进制中可视化它。有人能一步一步地对二进制进行可视化吗?

下面的所有数字都以二进制表示形式打印。

比如说,n在二进制表示中有m个数字。观察n & 11...1(m个1(将返回n。实际上,按位工作,如果x是一位数字(0或1(,则x & 1 = x。此外,观察到x & 0 = x。因此,要将数字n的第14位CCD_设置为0,我们需要用11111..1011..1进行运算and(&(,其中0正好位于从末尾算起的第19位k上。

现在我们需要生成11111..1011..0。除了一个数字,它有所有的1。如果我们否定它,我们得到00000..0100..1,它是由1 << k-1得到的。

总而言之:1 << k-1给了我们00000..0100..0。它的否定提供了CCD_ 25。最后,我们用输入做&

相关内容

  • 没有找到相关文章

最新更新