Java - 将整数的不同位设置为零

-2 java bitwise-operators

这是描述:

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

您发现某些数字的二进制表示形式中有一个经过修改的单个数字。更具体地说,在给定的数字 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)

有人可以解释该解决方案的作用及其语法吗?

tha*_*guy 5

详细解释你的功能

该表达式1 << (k - 1)将数字向左1精确移动一次,以 8 位数字 和 为例:k-1k = 4

换班前:00000001
换班后:00010000

这标志着位。你看,1被转移到了第四个位置,因为它位于位置。运算符~对每一位取反,意思是1成为00成为1。对于我们的例子:

否定前:00010000
否定后:11101111

最后,对两个操作数&执行按位与。假设我们有一个二进制n = 17的数字00010001。我们现在的例子是:

00010001 & 11101111 = 00000001

这是因为两个数字的每一位都是在同一位置上通过AND进行比较的。只有两个数字都保留的位置,所有其他位置都设置为。因此,仅保留零位置。1101

总的来说,您的方法int killKthBit(int n, int k)与二元运算符完全相同,它将knumber 位置上的位设置n0