知识点:二进制和十进制之间的相互转换
思路:
1、这是把一个十进制数,转换成2进制形式,存到数组中;
2、对数组中的每一位异或1取反,存到另外数组中;
3、根据2进制计算公式求Sum;
时间是6ms
int findComplement(int num) {
int a[32],b[32];
int i=0,j=0,k=0;
if(num == 0)
{
return 1;
}
while(num !=0)
{
j=num%2;
a[i]=j;
i++;
num=num /2;
}
for(;i>0;k++,i--)
{
b[k]=a[i-1]^1;
}
int sum=0;
for(int m=0;k>0;m++,k--)
{
sum+=b[k-1]*pow(2,m);
}
return sum;
}
看了高手的回答,我是佩服的很兴奋
int findComplement(int num) {
unsigned mask = ~0;
while (num & mask) mask <<= 1;
return ~mask & ~num;
}
思路大致一样,都是减法思路,但是别人这个想法还是很有意思。
下面这个思路:和full bit 异或 ,这种思路也是可以的,构造mask也是让我学习到了,比较好玩!
int findComplement(int num) {
int mask = num;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;
return num ^ mask;
}