剑指offer系列-T10二进制中1的个数

本次博客的程序让我们再次勾起与二进制的爱恨情仇,二进制数值最基本的位运算:与(&)、或(|)、非(~),异或(^),左移(<<),算数右移(>>),逻辑右移(>>>),都能帮我们解决很多问题。

/**
 * @author xhl
 * 二进制中1的个数
 * 题目描述:
 * 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
 *
 */
public class offerT10 {
	/*方法1:时间复杂度最小,比较的次数少,只操作为1的位。n=n&(n-1)每次去掉最右边的1,去一次count++一次,直到剩下0*/
	int NumberOf1(int n){
		int count=0;
		while(n!=0){
			n=n&(n-1);//每次处理掉最右边的那个1
			count++;
		}
		return count;
	}
	/*方法2:每一位都通过flag&n判断该位是0或者1*/
	int NumberOf12(int n){
		int count=0;
		int flag=1;
		while(flag!=0){
			if((flag&n)!=0)
				count++;
			flag=flag<<1;
		}
		return count;
	}
	/*方法3:书上说了不能n<<1,因为忽略了负数的情况,导致死循环,但Java里的<<<是逻辑右移*/
	int NumberOf13(int n){
		int count=0;
		int flag=1;
		while(n!=0){
			if((flag&n)!=0)
				count++;
			n=n>>>1;
		}
		return count;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		offerT10 o = new offerT10();
		System.out.println(o.NumberOf13(-1));
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值