将x的二进制值中,最后一个1置0,其它不变。即达到从x的尾部,删除一个1的效果。
二进制的减法规则中可以得知,在做x-1时,当把x写作
A1B
的形式,其中A为随意值,B为若干个0,可能为0个。
这时x-1的值,实际上是
A0C
的形式,其中A值不变,C为与B相同位数的1.
这样
x&(x-1)的结果,根据按位与的特性,当操作数一方为0时,结果为0,于是
x&(x-1) = A0B
对比x原始值A1B,x&(x-1)即把最后一个1改成0.
从命令的角度讲,是将x的每一bit(2进制中的1和0都占一个bit)与0001的每一bit做与运算.
"&"是"与运算"的意思,1&1=1,其他情况(1&0,0&1,0&0)都=0.
从逻辑的角度来讲,这个命令就是取x的最左边一位.例如x是0011,x&1得到0001,如果x是0110,x&1得到0000.
楼上正确,但是说的太复杂。
其实实际结果就是变量x的最后一位(二进制的个位),其它二进制位都是0的一个整数。
&是位操作运算符中的与运算,计算时,先把原来的十进制数转换成二进制,按照如下规则每一位对应着进行运算:
1&1=1
1&0=0
0&1=0
0&0=0
这道题就没这么麻烦了,因为9999是奇数,转换成二进制数后,最后一位肯定是1,所以9998除了最后一位是0以外,其他位数都和9999的相同,这样除了最后一位,其他位数只可能有两种运算:1&1=1和0&0=0,而最后一位进行的运算是1&0=0,这样,得到的结果就与9998的二进制数是一样的了,换言之
9999&9998=9998