-3
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。请也解释一下。我知道这些是按位运算,但我的概念不清楚。谢谢

4

3 回答 3

0

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

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

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

它就像除以 2 两次一样。所以 6->3->1.5 但是小数部分被截断,所以你只剩下 1。在二进制中,这将是 0110 -> 0011 -> 001.1 = 1.5(十进制)但截断 = 0001。

于 2013-08-12T18:00:46.017 回答
0

让我们分解每一行:

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

... 和:

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

...最后:

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

备注:复习一下您对位运算的知识可能是个好主意。

于 2013-08-12T17:45:21.243 回答
0

按位运算正是如此。你拿你的号码,你and每个人都用另一个号码。

这意味着,如果两个数字1在插槽上都有 a,那么你输出1,否则,你输出0

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

0111
0110

结果:

0110 (6)

你的例子6

0110
0101

结果:

0100 (4)

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

0110

并将所有位向右移动两次,你最终得到

0001

或者1

于 2013-08-12T17:45:22.123 回答