输入:5
输出:2
public int findComplement(int num) {
return (~num) & ((Integer.highestOneBit(num) << 1) - 1);
}
只用一行代码就解决了,我的问题是,到底是怎么推导出或者说怎么想到是这样做的?
当num=5的时候,
原码是:00001010
反码是:11110101
输出2
原码是:00000101
也就是说得有个办法既可以去掉5的反码前面4位的1111,又可以得到后面的0101,
但是如果这样来想的话,就有4种方式可以得到结果
00000111(正确)
00000011
00000110
00000010(不可能)
换句话说,我只要能够构建出上面3个的bit位就可以得到结果了,但问题是,我该构建哪一个呢?
他们到底是怎么知道代码那样的做法就能够构建出00000111这个正确的bit呢?
希望大家不吝赐教!