求一个数的补码

求一个数的补码

问题

给定一个正整数,输出其补数。补码策略是将二进制表示的位翻转。

注意:

  1. 给定的整数保证在32位有符号整数的范围内。
  2. 你可以假设在整数的二进制表示中没有前导零比特。

示例 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.

示例 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.

代码

题目描述:不考虑二进制表示中的首 0 部分。

对于 00000101,要求补码可以将它与 00000111 进行异或操作。那么问题就转换为求掩码 00000111。

public int findComplement(int num) {
    if (num == 0) return 1;
    int mask = 1 << 30;
    while ((num & mask) == 0) mask >>= 1;
    mask = (mask << 1) - 1;
    return num ^ mask;
}

可以利用 Java 的 Integer.highestOneBit() 方法来获得含有首 1 的数。

public int findComplement(int num) {
    if (num == 0) return 1;
    int mask = Integer.highestOneBit(num);
    mask = (mask << 1) - 1;
    return num ^ mask;
}

对于 10000000 这样的数要扩展成 11111111,可以利用以下方法:

mask |= mask >> 1    11000000
mask |= mask >> 2    11110000
mask |= mask >> 4    11111111
public int findComplement(int num) {
    int mask = num;
    mask |= mask >> 1;
    mask |= mask >> 2;
    mask |= mask >> 4;
    mask |= mask >> 8;
    mask |= mask >> 16;
    return (mask ^ num);
}

  转载请注明: ForwardXu 求一个数的补码

 上一篇
不用额外变量交换两个整数 不用额外变量交换两个整数
不用额外变量交换两个整数问题 不用额外变量交换两个整数。 代码 a = a ^ b; b = a ^ b; a = a ^ b;
2019-01-05
下一篇 
判断一个数是不是2的n次方 判断一个数是不是2的n次方
判断一个数是不是2的n次方问题 给定一个整数,编写一个函数来确定它是否是2的幂。 示例 1: Input: 1 Output: true Explanation: 20 = 1 示例 2: Input: 16 Output: true E
2019-01-05
  目录