LeetCode_476

问题:

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

  1. 给定的整数保证在32位带符号整数的范围内。
  2. 你可以假定二进制数不包含前导零位。

解析:

本题是将一个数的二进制按位取反,输出它的十进制。如5的二进制是101,按位取反为010,输出010的十进制2。最笨的办法是将数的二进制都取出,挨个取反,再加起来。代码如下:

    public int findComplement(int num) {
		List<Integer> l = new ArrayList<>();
		int complement = 0;
		while (num > 0) {
			l.add(num % 2);
			num /= 2;
		}
		for (int i = 0; i < l.size(); i++)
			complement += Math.pow(2.0d, i) * ((2 - l.get(i)) / 2);
		return complement;
	}

但显然本题有更简单的方法,按位取反,即1变成0,0变成1。这其中包含着关系:1-1=0,1-0=1。即用1减去这个数,得到的就是他的反。如5的二进制位101,用111减去101,得到010,这与按位取反效果相同。我们甚至不需要二进制,直接用十进制相减即可。求一个刚好比题中所给的数大的二进制全为1的数,用这个数减去题中所给的数,得到的就是按位取反后的二进制数的十进制表示。代码如下:

    public static int findComplement(int num) {
		int i = 0;
		while (i < num)
			i = 2 * i + 1;
		return i - num;
	}

猜你喜欢

转载自blog.csdn.net/Q_M_X_D_D_/article/details/81067638