-1

我了解每个操作员自己的工作,但我不知道他们如何交互以获得正确的结果。

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)

我用nas 37 和kas 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,我不确定如何以二进制形式将其可视化。有人可以通过二进制文件的可视化逐步完成吗?

4

1 回答 1

0

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

比如说,nm二进制表示的数字。观察到n & 11...1(m 个) 会返回n。实际上,按位工作,如果x是一位数字(0 或 1),则x & 1 = x. 此外,观察x & 0 = x. 因此,要将k数字的第 th 位设置n为 0,我们需要对 进行操作and( &) 11111..1011..1,其中 0 正好在k最后的第 th 个位置。

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

总而言之:1 << k-1给我们00000..0100..0。它的否定提供11111..1011..1. 最后,我们&处理输入。

于 2020-04-06T18:36:02.953 回答