码迷,mamicode.com
首页 > 编程语言 > 详细

算法题目

时间:2020-03-15 19:00:17      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:复杂   二次   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!