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;
	}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值