按位运算的输出说明

时间:2013-08-12 17:40:30

标签: c

void main() 
{ 
int x=7; 
printf("%d",x&(x-1));
int y=6; 
printf("%d",y&(y-1)); 
printf("%d",y>>2); 


}

当我输入一个奇数时,我得到输出n-1,其中n是一个奇数但是当我把y =偶数时,我得到输出0.我无法理解这个请帮助。

我的第二个问题是,当我打印y>> 2即6>> 2时,我得到了输出1.请解释我这个。我知道这些是按位操作,但我的概念并不清楚。谢谢

3 个答案:

答案 0 :(得分:0)

让我们打破每一行:

x&(x-1) => 0x111 & 0x110 => 0x110 => 6

......和:

y&(y-1)) => ox110 & 0x101 => 0x100 => 4

......最后:

y>>2 => 0x110 >> 2 => 0x001 => 1

备注:审核您对bitwise operations的了解可能是一个好主意。

答案 1 :(得分:0)

按位运算就是这样。你拿走你的号码,然后用and每一位用另一个号码。

这意味着,如果两个数字在广告位上都有1而不是您输出1,则输出0

所以,对于7的例子,你有

0111
0110

结果:

0110 (6)

您的6示例

0110
0101

结果:

0100 (4)

右移(>>)只是将所有位向右移动,所以如果你采取6

0110

并将所有位向右移动两次,最后以

结束
0001

1

答案 2 :(得分:0)

  
    

当我输入一个奇数时,我得到输出n-1,其中n是奇数,但是当我把y =偶数时,我得到输出0.我无法理解这一点,请帮助。

  

对于二进制存储,对于奇数,最低位始终为1,但由于您是ANDing,因此您实际上只是返回原始值-1(因为没有位移位)。在偶数的情况下,不是所有的都是0:8将:1000& 0111 = 0. 6不会:0110& 0101 => 0100 = 4.

  
    

我的第二个问题是,当我打印y>> 2即6>> 2时,我得到输出1.请解释我>>这也是。我知道这些是按位操作,但我的概念并不清楚。谢谢

  

它喜欢除以2两次。所以6-> 3-> 1.5但是分数部分是截断的,所以你留下1.在二进制中,这将是0110 - > 0011 - > 001.1 = 1.5(十进制)但截断= 0001。