使用bitwise和operator c ++

时间:2015-05-11 10:19:48

标签: c++ bit-manipulation bit bitwise-operators

我有以下代码

int n = 50;
while(n) {                         //1
    if(n & 1) cout << "1" << endl; //2 
    //right shift the number so n will become 0 eventually and the loop will terminate
    n >>= 1;                       //3
}

当我们使用按位和1(&amp; 1)数字时,我们得到相同的数字。 现在我的问题是c ++如何评估以下表达式:n&amp; 1。 时间:

  n = 50
  In binary form 50 is:            110010
  If we bitwise 1 then we get:  AND     1 = 110010
  Now in c++ (2) the expression evaluates like this:
  Instead of getting the whole sequence of bits (110010) bitwise anded with 1    
  it evaluates only the number of right bits we bitwise. In my example:
  n=50, 110010, use n & 1 ==> 0 AND 1 instead of 110010 AND 1.

c ++是否有理由对待这种情况?我的猜测是它与编译器有关吗?

2 个答案:

答案 0 :(得分:2)

  

当我们使用按位和1(&amp; 1)和数字时,我们会得到相同的数字。

不,我们不。我们返回由原始数字和1中设置的位组成的数字。由于只设置了最低位1,因此结果是原始数字的最低位。

  

现在我的问题是c ++如何评估以下表达式:n&amp; 1。

如果n为50,则为二进制:

n:    110010
1:    000001
n&1:  000000 // no bits set in both

如果n为51,则为二进制:

n:    110011
1:    000001
n&1:  000001 // one bit set in both

答案 1 :(得分:2)

来自Wikipedia:

  

按位AND运算符是单个&符号:&amp ;.它只是AND的表示,它对操作数的位而不是操作数的真值进行处理。按位二进制AND以二进制形式对数字的每个位置中的位进行逻辑AND(如上表所示)。

在您的示例中110010&amp; 11被视为000001,然后每位都是anded,您就会得到结果。实际上,我使用这种方法:1&number来检查偶数和奇数。这是如何:

if(1 & num)
  printf("it is odd");
else 
  printf("it is even");

这是它的工作原理:假设你有一个8位数。现在,1的8位表示法将为00000001

如果我现在对每个位执行and,对于所有前七位,我将获得0,因为它将是0 & anything将为0.现在,最后一位1是1.因此,如果我的号码的最后一位也是1,那么1 & 1 = 1,如果我的最后一位是0,那么1 & 0 = 0

我的号码中的最后一位何时才会1?当0时?转换为十进制形式时,最后一位乘以2 0 。并且,2 0 = 1.如果此1乘以1,我们得到一个奇数,如果它乘以0,我们得到一个偶数。