世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?
示例1
输入
1999 2299
输出
7
第一种:
把两个整数直接转化为二进制,再对两个二进制进行比较,看有多少位不一样。不过要注意的是,因为转化后的二进制是字符串形式,所以在对二进制进行比较时,要把单个元素当成字符而不是数字。比如,判断一位是否是1,应该if(s.charAt(i)=='1')而不是if(s.charAt(i)==1)。
代码如下:
package sort;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution solution = new Solution();
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int m = reader.nextInt();
System.out.println(solution.countBitDiff(n, m));
}
public int countBitDiff(int n, int m) {
int sum = 0;
String s1 = Integer.toBinaryString(n);
String s2 = Integer.toBinaryString(m);
int i, j;
for (i = s1.length() - 1, j = s2.length() - 1; i >= 0 && j >= 0; i--, j--) {
if (s1.charAt(i) != (s2.charAt(j)))
sum++;
}
if (i > j) {
while (i >= 0) {
if (s1.charAt(i--) == '1')
sum++;
}
} else {
while (j >= 0)
if (s2.charAt(j--) == '1')
sum++;
}
// sum += Math.abs(s1.length() - s2.length());
// 我终于明白了,原来是错在这里了,因为更大的那个数,多出来的那些二进制位也有很多是0,绝不可以都当做是1来算
// System.out.println(s1 + "\n" + s2);
return sum;
}
}
第二种方法:
把两个整数进行异或计算,统计结果中有多少个1即可得出有多少位二进制位不同。代码如下:
package chang;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner reader=new Scanner(System.in);
int m=reader.nextInt();
int n=reader.nextInt();
Solution solution=new Solution();
System.out.println(solution.countBitDiff(m, n));
}
//这是网上的一种方法
// public int countBitDiff(int m, int n) {
// int sum = 0;
// int dif=m^n;
// System.out.println(dif);
// while(dif!=0){
// dif=dif&(dif-1);
// System.out.println(dif);
// sum++;
// }
// return sum;
// }
public int countBitDiff(int m, int n) {
int sum = 0;
int dif=m^n;
String s=Integer.toBinaryString(dif);
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1')sum++;
}
return sum;
}
}