硬算谁都会算,能用位运算玩明白才是真牛啤。
假设num=0b00001011 ,假设用8位好算一点,实际上应当是32位,道理大同小异。
我们需要一个mask值mask=0b11110000来掩掉前4个0.
这样最终结果应当是~mask^num得到0b00000100。
现在用一个循环来获得mask值,原理很简单,只要后面的1与num有重叠,就左移。值得注意的是c++应当用unsigned,否则会报运行时异常。
class Solution {
public:
int findComplement(int num) {
unsigned int mask=0xffffffff;
while(mask&num){
mask<<=1;
}
return (~mask)^num;
}
};