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.请解释我这个。我知道这些是按位操作,但我的概念并不清楚。谢谢
答案 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。