来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-complement
题目描述:
给你一个 正 整数 num ,输出它的补数。补数是对该数的二进制表示取反。
示例 1:
输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:
输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
思路:
- 求出最高位1的位置,和一个从该位开始全是1的数异或即可。
- 例如:110 100 001,最高位第8位为1,则和111 111 111异或即可。
代码实现:
class Solution {
// 最高位1的索引.
public int bit_num = 1;
public int findComplement(int num) {
int idx = num;
int mark = 0;
while (mark < 32) {
if ((idx >> mark) == 0) break;
if (((idx >> mark) & 1) != 0) {
bit_num = mark;
}
mark++;
}
// 最高位上一位为1的值
bit_num = 1 << (bit_num + 1);
return num ^ (bit_num - 1);
}
}
网友评论