标签:复杂 二次 nbsp amp 执行 不同 简单 存在 除法
1.求二进制数中1的个数(题目与解法均来自《编程之美》第二章)
题目:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高。
解法1:举一个8位二进制的例子来分析,对于二进制操作,我们知道,除以一个2,原来的数字就会少个0,如果除的过程中有余,那么就表示当前位置有一个“1”。
以10 100 010 为例:
第一次除以2时,商为1 010 001 ,余为0;
第二次除以2时,商为101 000,余为1.因此可以利用整形数据除法的特点,通过相除和判断余数的值来进行分析,代码如下:
int Count(int v) { int num=0; while(v) { if(v%2==1){ num++;//判断是否有余1,并记录 } v=v/2; } return num; }
解法2:除操作比较复杂,可以通过向右唯一的操作达到目的,唯一的不同在于,位移之后如何判断是否有“1”的存在。例如:10 100 001 ,在向右移位的过程中,我们会把最后一位直接丢掉,因此,判断最后一位是否为“1”,可以通过“与”操作达到目的。将这个8位数与000 000 01 进行“与”操作,如果结果为“1”,则表明这个8位数的最后一位是1,否则为0,代码如下:
int Count(int v) { int num=0; while(v) { num+=v & 0x01; v>>=1; } return num; }
:书中还写了三种更简单的方法,但是我不怎么看得懂,就不抄在这里了。
标签:复杂 二次 nbsp amp 执行 不同 简单 存在 除法
原文地址:https://www.cnblogs.com/smallqizhang/p/12499210.html