LinCode-第181题 将整形A转换为B

描述:

         如果要将整数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;
	}






猜你喜欢

转载自blog.csdn.net/lin962792501/article/details/52444864