比如:输入:42 (0010 1010) 输出:32(0010 0000)
假设第i位为1,1~i-1位 为0,i+1~最后一位 为0或1,表示为x.
思路:
1)0000 0000 01xx xxxx 变成 0000 0000 0111 1111
2)用0000 0000 0111 1111 - 0000 0000 0011 1111,结果=0000 0000 0100 0000
如何实现1)呢?
我们把num=0000 0000 01xx xxxx,n=num二进制的位数。已知:1|0=1,1|1=1。因为第i位为1,可以将第i位的值,向后传递。num|(num>>1)的结果表示第i位和第i+1位都为1。将num|(num>>2)的赋值给num。继续执行num|(num>>2),结果表示第i,i+1,i+2,i+3位都为1。以此类推:将num|(num>>4)的赋值给num,结果表示第i,i+1...i+7(i+7<=n)都为1。将num|(num>>8)的赋值给num,结果表示第i,i+1...i+15(i+15<=32)都为1。因此解决实现了1)。