这是描述:
为了阻止疯狂编码器邪恶天才,你需要破译他发送给他的爪牙的加密信息。该消息包含几个数字,当输入超级计算机时,将向天空发射一枚导弹,遮挡阳光,让地球上的所有人都脾气暴躁和悲伤。
您发现某些数字的二进制表示形式中有一个经过修改的单个数字。更具体地说,在给定的数字 n 中,从右边算起的第 k 位最初被设置为 0,但其当前值可能不同。现在您需要编写一个函数,将 n 的第 k 位更改回 0。
例子
对于 n = 37 且 k = 3,输出应为killKthBit(n, k) = 33。
3710 = 1001012 → 1000012 = 3310。
对于 n = 37 且 k = 4,输出应为
杀死KthBit(n,k)= 37。
第 4 位已经是 0(看起来 Mad Coder 忘记加密这个数字了),所以答案仍然是 37。”
这是我找到的解决方案,但我无法理解它:
int killKthBit(int n, int k)
{
return n & ~(1 << (k - 1)) ;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释该解决方案的作用及其语法吗?
详细解释你的功能
该表达式1 << (k - 1)将数字向左1精确移动一次,以 8 位数字 和 为例:k-1k = 4
换班前:00000001
换班后:00010000
这标志着位杀。你看,1被转移到了第四个位置,因为它位于零位置。运算符~对每一位取反,意思是1成为0和0成为1。对于我们的例子:
否定前:00010000
否定后:11101111
最后,对两个操作数&执行按位与。假设我们有一个二进制n = 17的数字00010001。我们现在的例子是:
00010001 & 11101111 = 00000001
这是因为两个数字的每一位都是在同一位置上通过AND进行比较的。只有两个数字都保留的位置,所有其他位置都设置为。因此,仅保留零位置。1101
总的来说,您的方法int killKthBit(int n, int k)与二元运算符完全相同,它将knumber 位置上的位设置n为0。
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |