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。请也解释一下。我知道这些是按位运算,但我的概念不清楚。谢谢
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。请也解释一下。我知道这些是按位运算,但我的概念不清楚。谢谢
当我输入一个奇数时,我得到输出 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。
让我们分解每一行:
x&(x-1) => 0x111 & 0x110 => 0x110 => 6
... 和:
y&(y-1)) => ox110 & 0x101 => 0x100 => 4
...最后:
y>>2 => 0x110 >> 2 => 0x001 => 1
备注:复习一下您对位运算的知识可能是个好主意。
按位运算正是如此。你拿你的号码,你and
每个人都用另一个号码。
这意味着,如果两个数字1
在插槽上都有 a,那么你输出1
,否则,你输出0
所以,对于你的例子,7
你有
0111
0110
结果:
0110 (6)
你的例子6
有
0110
0101
结果:
0100 (4)
右移 ( >>
) 只是将所有位向右移动,所以如果你取 6
0110
并将所有位向右移动两次,你最终得到
0001
或者1