https://leetcode.com/problems/number-complement/
分析
也即把一个数最高比特位后的比特位取反即可,关键要找出最高比特位,简单的位操作,十几分钟搞定,位操作使用还要加强,神技能啊。
实现一
int findComplement(int num) {
int i = 0;
int tmp=0;
int max=0;
for(i=0;i<32;i++)
{
tmp=0x80000000>>i;
if((num &tmp) == tmp)
{
max=i;
break;
}
}
num = ~num;
num &= 0xFFFFFFFF>>max;
return num;
}
实现二
int findComplement(int num) {
int tmp = num;
/* 将最高位后面的位都置为1 */
tmp |= (tmp>>1);
tmp |= (tmp>>2);
tmp |= (tmp>>4);
tmp |= (tmp>>8);
tmp |= (tmp>>16);
num = ~num;
num &= tmp;
return num;
}