以下是描述:
为了阻止Mad Coder邪恶的天才,你需要破译他发给他的仆从的加密信息。该消息包含几个数字,当输入超级计算机时,它会向天空发射导弹阻挡太阳,并使地球上的所有人都变得脾气暴躁和悲伤。
你发现有些数字在二进制表示中有一个修改过的单个数字。更具体地,在给定数量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(看起来Mad Coder忘了加密这个号码),所以答案仍然是37。"
这是我找到的解决方案,我无法理解:
int killKthBit(int n, int k)
{
return n & ~(1 << (k - 1)) ;
}
有人可以解释解决方案的作用及其语法吗?
答案 0 :(得分:3)
功能的详细说明
表达式1 << (k - 1)
将数字1
向右移动k-1
次,以便作为8位数和k = 4
的示例:
轮班前:00000001
转移后:00010000
这标志着 kill 。您看,1
已转移到第四个位置,因为它位于零位置。运算符~
否定每一位,意味着1
变为0
而0
变为1
。对于我们的例子:
在否定之前:00010000
否定后:11101111
最后,&
在两个操作数上执行按位AND 。我们说,我们有一个n = 17
,它是二进制的00010001
。我们现在的例子是:
00010001 & 11101111 = 00000001
这是因为两个数字的每个位都在相同位置上通过 AND 进行比较。只有两个数字都有1
的位置保持1
,所有其他位置都设置为0
。因此,只有零位保持1
。
总体而言,您的方法int killKthBit(int n, int k)
与二元运算符完全相同,它会将数字k
的位置n
设置为0
。
答案 1 :(得分: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)));
}