【问题标题】:What does this bitwise expression do?这个按位表达式有什么作用?
【发布时间】:2015-08-04 09:00:47
【问题描述】:

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);
}
}

【问题讨论】:

  • 表达式逻辑上表示ANDnn,其位右移一位。因此,无论您在哪里这样做,您的表达都会派上用场。如果您发布使用此表达式的代码,则可能会说更多。

标签: c++ bitwise-operators


【解决方案1】:

它检查n 中的连续的。它对nn 执行按位与运算,向右移动一位。如果n 的二进制表示至少有两个相邻的,你会得到这样的:

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

将此与原始作业进行比较:

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

【讨论】:

    【解决方案2】:

    首先将变量n中的位右移

    >> - 按位右移

    然后对移位后的位进行 and 操作..

    & - 按位和运算。

    这里的完整操作是这样发生的

    考虑int n=6

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

    所以你说 no 将是 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);
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 2020-11-15
      • 2020-11-20
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多