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

时间:2016-11-08 09:16:55

标签: java bitwise-operators

以下是描述:

  

为了阻止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)) ;
}

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

2 个答案:

答案 0 :(得分:3)

功能的详细说明

表达式1 << (k - 1)将数字1向右移动k-1次,以便作为8位数和k = 4的示例:

轮班前:00000001
转移后:00010000

这标志着 kill 。您看,1已转移到第四个位置,因为它位于位置。运算符~否定每一位,意味着1变为00变为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)));
}