Number Complement
原题目:
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.
Note:
- The given integer is guaranteed to fit within the range of a 32-bit signed integer.
- You could assume no leading zero bit in the integer’s binary representation.
翻译后:
给定一个正整数,输出其补数。补充策略是翻转其二进制表示的位。
注意:
- 给定的整数保证适合在32位有符号整数的范围内。
- 你可以在整数的二进制表示中假定没有前导零位。
解释:
说白了,就是给你一个数字,求它二进制的反码是多少。是不是很直观很到位。。。。
思路:
1、首先把传进来的数字转换为二进制;
2、求这个二进制数的反码;
3、求这个反码的值。
因为不用考虑二进制的符号位,所以这个题还是非常简单的,但是如何用代码简单高效的实现,还是得思考思考滴,我自己写的代码如下:
package com.mianshi.suanfa.NumberComplement;
/**
* Created by macbook_xu on 2018/3/26.
*/
public class Solution {
public static int findComplement(int num) {
String two = Integer.toBinaryString(num);//转化二进制
String newTwo = "";
for (int i = 0 ; i<two.length() ; i++){//获得反码
if (two.charAt(i)=='0'){
newTwo += '1';
}else {
newTwo += '0';
}
}
int anw = 0;
int a = 0;
for (int i = newTwo.length()-1 ; i>=0 ; i--){
if (newTwo.charAt(i)=='0'){
a++;
}else {
anw += Math.pow(2,a);//求2的a次方
a++;
}
}
return anw;
}
public static void main(String[] args) {
System.out.println(findComplement(32));
}
}
完全按照我自己的思路来写的。。。中间转二进制用的是jdk自带的方法,这算不算偷懒。。。当然,还是有大神厉害的代码:
public class Solution {
public int findComplement(int num) {
return ~num & (Integer.highestOneBit(num) - 1);
}
}
这个代码嘛。。。。我是完全没看懂,也许是我真的太笨了,一行代码,解决问题。我只能解释一下,highestOneBit()这个方法,返回具有至多单个 1 位的 int 值,在指定的 int 值中最高位(最左边)的 1 位的位置。如果指定的值在其二进制补码表示形式中不具有 1 位,即它等于零,则返回零。这是jdk的解释,需要好好理解一下,虽然我现在知道什么意思,但我不知道该怎么把它说明白,还是靠大家自己理解了。。。。。这个代码是非常厉害,还得好好学一学,以后理解了为什么这么实现,再讲。