二进制中1的个数

对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数。

1.最简单的也是最容易想到的就是将这个数对2取余,然后再除以2,一直循环到为0。这就是将一个数转换成2进制的方法。

int Count(int n)
{
	int sum=0;
	while(n)
	{
		if(n%2==1)
			sum++;
		n=n/2;
	}
	return sum;
}

2.一个正数除以2等同与这个正数右移一位,而取余相当于测试这个数的最后一位是不是“1”。从而可得到:

int Count(int n)
{
	int sum=0;
	while(n)
	{
		if(n&1==1)
			sum++;
		n=n>>1;
	}
	return sum;
}


3.这个方法有点新颖,一个非零数与比它小1的数&操作之后若为0,则表明这个数只有一位是1.例如:

   01000         101100
 &00111      &101011   
   00000        101000
从上面可以看到,二个相邻的数,较大的数的从右往左第一个为“1”的位的左边和较小的数一样,而这个位置(包括这个位置)的右边与较小的数相反。

int Count(int n)
{
	int sum=0;
	while(n)
	{
		n=n&(n-1);
		sum++;
	}
	return sum;
}

扩展:
1.给定两个正整数(二进制形式表示)a和b,问把a变成b需要改变多少位(bit)?也就是整数a和b的二进制表示中有多少位是不同的。
首先a^b,在计算a^b中有多少个“1”就可以了。
2.不用赋值交换a,b的值。
a=a^b,
b=a^b,
a=a^b.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值