欢迎 airforce 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 技术论坛 网站留言 娱乐中心 卓越资源
今天是:2009年01月08日 星期四  您现在位于: 首页 → 技术文章 → 判断无符号整数的二进制...
   判断无符号整数的二进制表示中1的个数
作者:raincatss  出处:raincatss.cublog.cn  更新时间: 2007年05月31日 

网上找到判断无符号整数的二进制表示中1的个数的算法总结如下:

算法一

int count_ones(unsigned a)
{
    int count = 0;

    for (; a; a >>= 1) {
        if (a & 1) count ++;
    }

    return count;
}

算法二

int count_ones(unsigned a)
{
    int count = 0;

    for (; a; count ++) {
        a &= a - 1;
    }

    return count;
}

算法三

int count_ones(unsigned a)
{
    a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
    a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
    a = (a & 0x0f0f0f0f) + ((a >> 4) & 0x0f0f0f0f);
    a = (a & 0x00ff00ff) + ((a >> 8) & 0x00ff00ff);
    a = (a & 0x0000ffff) + ((a >> 16) & 0x0000ffff);

    return a;
}

算法四

const int ones[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2,\
 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,\
 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2,\
 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5,\
 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5,\
 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,\
 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3,\
 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3,\
 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5,\
 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6,\
 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};

int count_ones(unsigned a)
{
    return (ones[a & 0xff] + ones[(a >> 8) & 0xff] + ones[(a >> 16) & 0xff]\
        + ones[(a >> 24) & 0xff]);
}

写程序生成0-10000之间随机数共1亿个为样本进行时间测试,结果如下:

sxl@sxl-desktop:~/cpro$ gcc -v

gcc version 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)

 

sxl@sxl-desktop:~/cpro$ time ./text0 < input >/dev/null

real 1m46.726s

user 1m44.691s

sys 0m1.632s

 

sxl@sxl-desktop:~/cpro$ time ./text1 < input >/dev/null

real 1m45.945s

user 1m43.698s

sys 0m1.664s

 

sxl@sxl-desktop:~/cpro$ time ./text2 < input >/dev/null

real 1m42.497s

user 1m40.130s

sys 0m1.700s

 

sxl@sxl-desktop:~/cpro$ time ./text3 < input >/dev/null

real 1m23.812s

user 1m21.449s

sys 0m1.756s

配置为:C4 1.7G/256M DDR266

可见当数据量较大时,算法四效率稍高,其它三个所用时间差不多。

附随机数生成程序源代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    for (int i = 0; i < 100000000; i ++) {
        printf("%d ", rand() % 10000);
    }

    return 0;
}

参考资料:

http://www.everything2.com/index.pl?node=counting%201%20bits

 (本文已被浏览 4151 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:不用临时变量交换两个数的值
下篇文章:C语言中用bsearch()实现查找操作
 相关文章:
SCO OpenServer 5.0.7连上SQLSERVER2000全纪录 SCO OpenServer 5.0.7制作紧急启动光盘的方法
将SCO OpenServer 5.0.6安装到IBM X3650上 如何把一个软盘镜像HBA文件转光盘ISO格式HBA文件
SCO操作系统安装Serial ATA (SATA)硬盘的方式 ubuntu 8.04 上安装 oracle 10g
sco unix 5.07 使用windows FAT 格式的USB盘过程 制作带有hpsas驱动的SCO5.0.6应急和引导光盘安装G5
联想扬天M2600C安装SCO5.0.6+Windows XP 万年历的C语言程序
Sco UNIX的核心引导过程详解 Fedora 7一共有3种类型的Live镜像
Fedora 7下玩游戏 优化Fedora 7,关掉不需要的Fedora services
Linux 下 C 语言编程 C语言常见错误
在centos 5中使用xfce桌面环境 C语言中用qsort()快速排序
不使用逻辑运算求得两数的最大值 C语言中用bsearch()实现查找操作

相关搜索
查看百度中关于判断无符号整数的二进制表示中1的个数的更多内容
查看google中关于判断无符号整数的二进制表示中1的个数的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.