描述:
如果要将整数A转换为B,需要改变多少个bit位?
样例:
如把31转换为14,需要改变2个bit位。
(31)10=(11111) 2
(14)10=(01110) 2
分析:
实现方式可以用List分别记录两个数字的二进制的每一位,然后从最低位数开始比较,记录有几位是不一样即可。
注意事项:
两个数字获得的二进制长度可能不一样, 二进制位数少的整数,需要在左边添加0,此时需要判断二进制位数多的数字多出的部分有几个不为“0”
两个数字应考虑出现负数的情况,这时候需要将负数转换成无符号整数
若两个都为负数,装换成无符号整数之后最高位都为1
代码实现:
public int bitSwapRequired(int a, int b) {
// write your code here
if(a==0&&b==0){
return 0;
}
//a、b为正整数时
if(a>0&&b>0){
//用于记录两个数字的二进制的每一位
List<Integer> list_a = new ArrayList<Integer>();
List<Integer> list_b = new ArrayList<Integer>();
getList(list_a,a);
getList(list_b,b);
if(list_a.size()>=list_b.size()){
return getCount(list_a,list_b);
}else{
return getCount(list_b,list_a);
}
} else{
List<Long> list_la = new ArrayList<Long>();
List<Long> list_lb = new ArrayList<Long>();
long ua = a & Integer.MAX_VALUE;
long ub = b & Integer.MAX_VALUE;
ua |= 0x80000000L;
ub |= 0x80000000L;
getList(list_la,ua);
getList(list_lb,ub);
int count =0;
if(list_la.size()>=list_lb.size()){
count = getLongCount(list_la,list_lb);
}else{
count = getLongCount(list_lb,list_la);
}
//两个都为负数时,最高位相同
if(!(a<0)||!(b<0)){
count++;
}
return count;
}
}
//获得num的二进制的每一位,存在list中(此函数针对int型)
private void getList(List<Integer> list,int num){
while(num>0){
list.add(num%2);
num/=2;
}
}
//获得num的二进制的每一位,存在list中(此函数针对long型)
private void getList(List<Long> list,long num){
while(num>0){
list.add(num%2);
num/=2;
}
}
//计算两个list不同的个数(两个整数都是int)
private int getCount(List<Integer> list_a,List<Integer> list_b){
int count = 0;
for(int i=0;i<list_b.size();i++){
if(list_a.get(i)!=list_b.get(i)){
count++;
}
}
//判断二进制位数多的数字多出的部分有几个不为“0”
for(int i= list_b.size();i<list_a.size();i++){
if(list_a.get(i)!=0){
count++;
}
}
return count;
}
//计算两个list不同的个数(两个整数都是long)
private int getLongCount(List<Long> list_la,List<Long> list_lb){
int count = 0;
for(int i=0;i<list_lb.size();i++){
if(list_la.get(i)!=list_lb.get(i)){
count++;
}
}
//判断二进制位数多的数字多出的部分有几个不为“0”
for(int i= list_lb.size();i<list_la.size();i++){
if(list_la.get(i)!=0){
count++;
}
}
return count;
}