476. Number Complement
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
Note:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- You could assume no leading zero bit in the integer’s binary representation
给了一个32位的int型数,要求得到他的无前导0的二进制表示下的补码
说真的这样的题目颇有ICS lab的风范,各种只能用位运算解题什么的QAQ
幸运的是这道题目不要求只能用位运算,所以就有了行数多一些的好想一些的解法啦
class Solution
{
public:
int findComplement(int num)
{
unsigned int mask1=1<<31;
while ((mask1&num)==0) mask1>>=1;
//mask1 shows the highest bit of 1
//mask2==mask3 shows a number with 1's from mask to lowbit
unsigned int mask3=(mask1<<1)-1;
//another version
//unsigned int mask2=0;
//while (mask1!=0)
//{
// mask2+=mask1;
// mask1>>=1;
//}
return mask3-num;
}
};
我们可以看到,我的思路还是很质朴的。先求出最高位的0在哪里(这里我用了一个朴素的循环),然后找到了最高位的0之后得到了一串只有所有低位有1的掩码mask,然后用mask-num就像是对num的低位取反高位不变,就能得到结果啦
上面有两种算法。我先用的是mask3这样的算法,跑了时间是3ms。看到有人是0ms的就想着优化一下,于是有了mask2那样求掩码的方法,结果变成了6ms!!天知道为什么的情况下我辗转反侧各种对比研究,最后发现两种应该都是3ms。至于我为什么刷出了6ms的解鬼知道23333