剑指offer系列--11、二进制表示中1的个数

11、二进制表示中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解法

1、除二取余法

  • 由于题目没有提供,是多少位的补码。
  • 所以我这种方法怎么算,测试案例都过不了。
   public int NumberOf1(int n) {
   	ArrayList<Integer> list=new ArrayList<>();
   	ArrayList<Long> list1=new ArrayList<>();
   	if(n==0){    		
   		return 0;
   	}
   	if(n>0){
   		while(n>=2){
   			list.add(n%2);
   			n=n/2;
   		}
   		list.add(n);   	
   		int rs=0;
   	   	for(int i=0;i<list.size();i++){
   	   		if(list.get(i)==1){
   	   			rs=rs+1;
   	   		}
   	   	}
   			return rs;
   	}else{
   		long m =Math.abs((long)n);
   		
   		while(m>=2){
   			list1.add(m%2);
   			m=m/2;	
   		}
   		list1.add(m);
   		
   		// 补齐32位
   		for(int i=list1.size();i<31;i++){
   			list1.add(0L);
   		}
   		if(list1.size()<32){
   			list1.add(1L);
   		}
   		
   		
   		
   		// 取反操作
   		for(int i=0;i<list1.size()-1;i++){
   			if(list1.get(i)==0){
   				list1.set(i, 1L);
   			}else{
   				list1.set(i, 0L);
   			}
   		}
   		// 加一操作
   		long jinwei=1L;
   		for (int i=0;i<list1.size()-1;i++){
   			if((list1.get(i)+jinwei)<=1){
   				list1.set(i, list1.get(i)+jinwei);
   				jinwei=0L;
   				break;
   			}else {
					list1.set(i, 0L);
				}
   			
   		}
   		int rs=0;
   	   	for(int i=0;i<list1.size();i++){
   	   		if(list1.get(i)==1L){
   	   			rs=rs+1;
   	   		}
   	   	}
   			return rs;
   	}
  

   }

2、java现有api:Integer.toBinaryString

  public int NumberOf11(int n) {
   	if(n==0){
   		return 0;
   	}
   	String str =Integer.toBinaryString(n);
   	int rs=0;
   	for (int i=0;i<str.length();i++){
   		if(str.charAt(i)=='1'){
   			rs++;
   		}
   	}
   	return rs;	
   }

3、移位运算

  • 若一个整数不为0,那么这个整数的二进制表示至少有一位是1
  • 将这个整数减1,则原来处在最右边的1就会变成0
  • 原来在1后面的所有0,都会变成1。
  • 其余所有位将不会受到影响。

举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1.
减去1以后,变成1011,减1的效果就是把最右边的一个1开始的所有位都取反了此时将n与n-1做与运算,从原来整数最右边的1那一位开始所有位都变成0了.即把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

    public int NumberOf(int n) {
    	if(n==0){
    		return 0;
    	}
    	int rs=0;
    	while(n!=0){
    		n=n&(n-1);
    		rs++;
    	}
		return rs;
    }
    

移位运算:

public class Solution {
  public int NumberOf1(int n) {

    int count = 0;
    while(n != 0) {
      // n的二进制末尾是否为1  
      count += (n & 1);
      n >>>= 1;
    }

    return count;
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值