leetcode476. Number Complement

来源:互联网 发布:mac 改桌面图标大小 编辑:程序博客网 时间:2024/05/16 09:10

Input: 5Output: 2Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

一:知识补充

java中取反 是会看第一位是符号位 如果是1就会转为负数 我不想要这样的结果 就是把它当成无符号

如~12  // -13 ,解释如下。


首先,你要知道java中的int是32位的
其次,正数以原码的形式存储,负数以补码的形式存储
12的二进制是0000 0000 0000 0000 0000 0000 0000 1100
取反后得1111 1111 1111 1111 1111 1111 1111 0011
java中都是有符号数,首位是1,所以是负数,负数也就是补码,也就是说
1111 1111 1111 1111 1111 1111 1111 0011是补码
补码,反码加1后得源码
转换成源码得0000 0000 0000 0000 0000 0000 0000 1101
这个数是13,加上符号就是-13

二:知识补充

Integer.highestOneBit(num) 方法找出最高位,这个函数的作用是取num这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

  • 如果一个数是0, 则返回0;
  • 如果是负数, 则返回 -2147483648:【1000,0000,0000,0000,0000,0000,0000,0000】(二进制表示的数);
  • 如果是正数, 返回的则是跟它最靠近的比它小的2的N次方

比如 17: 
二进制是【0000,0000,0000,0000,0000,0000,0001,0001】

highestOneBit(17)返回的是最高位的1个1, 其它全是0 的二进制数:【0000,0000,0000,0000,0000,0000,0001,0000】,其实就是16。

三:求解方法

1.首先对整形数num按位取反,~num。这个操作后,我们需要判断有效位的个数。

2.采用Integer.highestOneBit(num) 方法找出最高位。

这个函数的作用是取num这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。

3.左移后-1,这样有效位全部被赋予1。

4.与~num进行位与操作。

 return ~num & ((Integer.highestOneBit(num) << 1) - 1);

由于有效位的最高位的相反值一定是0,所以左移一位没有必要。最终结果:
return ~num & (Integer.highestOneBit(num) - 1); 

Tip:10000000这个二进制-1之后,就是01111111


四:补充解法

100110, its complement is 011001, the sum is 111111. 

然后直接计算111111的值,然后用111111-100110

这个方法不是很好,没有用到位运算的知识。


原创粉丝点击