题目:
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.
Example 1:
Input: 5 Output: 2 Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.
Example 2:
Input: 1 Output: 0 Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
题目大意就是翻转一个integer 最高位比特位之前(包括最高位)上的值,然后输出翻转后的整数;
解题思路:
我想到的方式是不断对整数1进行位移操作,每次位移操作后与该数做 “与”操作,判断是否要翻转。
退出条件:
位移操作不能超过30次,此时integer 32位[32(符号位),1~31数值位]反正就是到符号位之前停止就好了。
面对一些不大的值,我设定了一旦位移操作后的1大于该值则直接退出,不知道会不会提高一点性能(不好说,看测试样例分布)
代码:
public class Solution {
public int findComplement(int num) {
int res = 0;
int aPointer =1;
int count =0;
while(count<31){
if((aPointer<<count) >= num){
break;
}else if(((aPointer<<count)&num) == 0){
res = res | (aPointer<<count);
}
count++;
}
return res;
}
}
运行结果: