我了解每个单独的操作符自己做什么,但我不知道它们是如何交互以获得正确的结果的。
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。最后,我们用输入做&
。