2016-11-08 67 views
-3

下面是说明:爪哇 - 设置一个整数的独特位为零

为了阻止你需要破译送给他的爪牙加密的消息疯编码器邪恶的天才。这条消息包含了几个数字,当输入一台超级计算机时,将会发射一枚导弹进入遮挡太阳的天空,并让地球上所有的人都变得脾气暴躁和伤心。

您发现某些数字在其二进制表示中有一个修改的单个数字。更具体地说,在给定数量n中,从右边开始的第k位最初被设置为0,但其当前值可能不同。它现在你来写,这将改变n的第k个比特回0

对于n = 37和k中的功能= 3,输出应该是 killKthBit(N,K) 33. =

3710 = 1001012〜> 1000012 = 3310

对于n = 37和K = 4,输出应该是

killKthBit(N,K)= 37

第4位为0已经(貌似疯狂的编码器忘记加密此数),所以答案仍然是37.”

这里是一个解决方案,我发现,我无法理解这一点:

int killKthBit(int n, int k) 
{ 
    return n & ~(1 << (k - 1)) ; 
} 

有人可以解释什么解决方案和它的语法?

回答

3

你的函数

1 << (k - 1)移位数1恰好k-1倍的表达的详细解释的左,以便为一个8位的数目和k = 4一个例子:

移位之前:00000001
换档后:00010000

这标志着k生病。你看,1被转移到第四个的位置,因为它在位置。运营商~否定每一位,这意味着1变为00变成1。在我们的例子:

否定之前:00010000
否定后:11101111

最后,&执行两个操作数位与。让我们说,我们有一个数字n = 17,它是二进制的00010001。现在示例是:

00010001 & 11101111 = 00000001

这是因为这两个号码中的各个位由上同一位置比较。只有职位,其中两个号码1仍然1,其他所有其他设置为0。因此,只有位置零仍然是1

总体而言,您的方法int killKthBit(int n, int k)与二元运算符完全相同,它将位置k的位n设置为0

0

这里是我的尝试

//Returns a number that has all bits same as n 
// except the k'th bit which is made 0 
int turnOffK(int n, int k) 
{ 
    // k must be greater than 0 
    if (k <= 0) return n; 

    // Do & of n with a number with all set bits except 
    // the k'th bit 
    return (n & ~(1 << (k - 1))); 
}