这个按位表达式做什么?

时间:2015-08-04 09:00:48

标签: c++ bitwise-operators

n & (n>>1)

我在哪里可以使用上面的表达式?我正在处理this问题,我看到this解决了使用表达式的问题。

问题 -

You are given an integer n find its next greater or equal number whose    
binary representation must not contain consecutive ones.

代码 -

main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
    scanf("%d",&n);
    while((n&(n>>1)))
    {
        n++;
    }
    printf("%d\n",n);
}
}

2 个答案:

答案 0 :(得分:10)

它会检查n中的连续值。它对n进行按位AND运算,n向右移一位。如果n的二进制表示具有至少两个相邻的表示,您将得到如下内容:

n    :       00001100 
n>>1 :       00000110
---------------------
n & (n>>1) : 00000100

将此与原始作业相比较:

  

给你一个整数n找到它的下一个更大或相等的数字   二进制表示不得包含连续的表示。

答案 1 :(得分:1)

首先将变量n中的位移位到右侧

>> - 按位向右移动

然后使用移位位执行和操作..

&安培; - 按位和操作。

这里完成了这样的操作

考虑int n=6

所以它的二进制等价值是110 ..你必须找出下一个大于或等于的数字,其二进制等价物不应该包含两个连续的一个。

所以你不会是8,因为它的二进制等价值是1000

所以,如果你执行

(n>> 1)结果将为011

如果您执行并操作

011
110

结果将是

010 

现在追踪你的答案代码

main()
{
 int t,n;
 scanf("%d",&t);
 while(t--)
 {
    scanf("%d",&n);
    while((n&(n>>1)))
    {
        n++;
    }
    printf("%d\n",n);
 }
}