计算整数的二进制表示中1的个数

计算整数的二进制表示中1的个数


算法一:(最容易想到)

最容易想到的算法是用1进行移位与运算   如7的二进制表示为0111 用二进制 标志flag=0001 与7= 0111 运算判断最右边第一位为1 则计数加一,把flag左移一位为0010 与7= 0111进行与运算判断 7=0111 的二进制表示的倒数第二位为1,则计数加一  ,如此类推 当flag左移到为0时 则可计算出 7 = 0111 有3个1.

//通过移位来计算  整数的二进制表示中有多少个1
	public static int numberOf1(int n){
		int count = 0;
		int flag = 1;
		while(0 != flag){
			
			if(0 != (n & flag))
				count++;
			flag = flag << 1;
		}
		return count;
	}


算法二:利用 n & (n-1) 会把 n 的最右边的1清零

例如:6 = 0110  ;6 & (6-1)= 0100 

此算法要比算法一更快,因为对于int型的整数来说  会循环32次;而算法二有多少个1就会循环多少次
对于需要计算整数的二进制有多少个1都可以用算法二计算(把最右边的1变成0;也可用于解决其他类似的问题),不多说 上代码更直观


//通过 n&(n-1) , n&(n-1)会把该整数最右边一个1变成0      计算 整数的二进制表示中有多少个1
	public static int numberOf2(int n){
		int count = 0;
		while(0 != n){
			count++;
			n = n & (n-1);
		}
		return count;
	}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值