476. 数字的补数
题目描述
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。
模拟
- 十进制转化为二进制;
- 二进制取反(这里只有正数);
- 二进制转换为十进制
class Solution {
public int findComplement(int num) {
String bin = toBin(num);
String reverse = reverse(bin);
System.out.println("bin = " + bin);
System.out.println("reverse = " + reverse);
return binToTen(reverse);
}
public static void main(String[] args) {
Solution obj = new Solution();
int num = 5;
System.out.println(obj.findComplement(num));
}
// 二进制转为十进制
public int binToTen(String num) {
int i = 0;
int n = num.length();
// 去掉前导 零
while (i < n && num.charAt(i) == '0') {
i++;
}
//
int res = 0;
System.out.println("n = " + n);
System.out.println("i = " + i);
for (int j = i; j < n; j++) {
int cnt = num.charAt(j) - '0';
res += (cnt * Math.pow(2, n - 1 - j));
}
return res;
}
// 取反码
public String reverse(String num) {
System.out.println("num = " + num);
// 这里都是正数,把 [0, len) 取反即可
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num.length(); i++) {
sb.append(num.charAt(i) == '1' ? '0' : '1');
}
return sb.toString();
}
public String toBin(int num) {
StringBuilder sb = new StringBuilder();
while (num != 0) {
sb.append(num % 2);
num /= 2;
}
return sb.reverse().toString();
}
}
位运算
思路:
- 从前向后找 二进制第一个非 0 的位置;
- 在从后向前遍历:
- 如果是 0,则取反;
- 如果是 1,取 0(ans 本身就为0,所以不用管)
class Solution {
public int findComplement(int num) {
int s = -1; // 二进制第一个非 0 的位置
for (int i = 31; i >= 0; i--) {
if (((num >> i) & 1) != 0) {
s = i;
break;
}
}
//
int ans = 0;
for (int i = 0; i < s; i++) {
// 如果是 0,则取反;如果是 1,取 0(ans 本身就为0,所以不用管)
if (((num >> i) & 1) == 0) {
ans |= (1 << i);
}
}
return ans;
}
}