求二进制数中"1"的个数
2015-05-11 16:27
141 查看
本题同样来自《编程之美》。
对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数。
笨方法:
对于二进制操作,除以一个2,原来的数字就会减少一个0.(可以类比十进制,十进制除以一个10,则相应会减少一个0)
如果除的过程中有余,那么就表示当前位置有一个1.
#include<stdio.h>
typedef unsigned char BYTE;
int Count(BYTE v)
{
int num = 0;
while(v)
{
if(v%2==1)
num++;
v=v/2;
}
return num;
}
int main()
{
BYTE b1 = 0;
BYTE b2 = 129;
BYTE b3 = 255;
printf("b1 :%d\n",Count(b1));
printf("b2 :%d\n",Count(b2));
printf("b3 :%d\n",Count(b3));
return 0;
}
![](https://img-blog.csdn.net/20150511161229860)
好方法:
右移操作同样可以达到相除的目的。
右移后,与00000001进行“与”操作。
int Count(BYTE v)
{
int num = 0;
while(v)
{
num+=v&0x01;
v>>=1;
}
return num;
}
![](https://img-blog.csdn.net/20150511161229860)
聪明方法:
虽然使用位操作的效率比笨方法高多了,但是,时间复杂度仍为O((log2)v)。
想办法使时间复杂度只与“1”的个数相关。
若v为:01000000,则v-1为:00111111。两者相与为0。
若v为:01100000,则v-1为:01011111。两者相与为01000000。此时和第一种情况一样。再次操作后,为0。
所以,根据这个规律,我们考虑v和v-1相与,统计结果为0之前的次数即为“1”的个数。
int Count(BYTE v)
{
int num = 0;
while(v)
{
v&=(v-1);
num++;
}
return num;
}
![](https://img-blog.csdn.net/20150511161229860)
此外,还有空间换时间的方法。
将所有的256种情况存储在数组中。
根据v的不同,直接取相应的情况即可。
算法时间复杂度仅为O(1)。
对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数。
笨方法:
对于二进制操作,除以一个2,原来的数字就会减少一个0.(可以类比十进制,十进制除以一个10,则相应会减少一个0)
如果除的过程中有余,那么就表示当前位置有一个1.
#include<stdio.h>
typedef unsigned char BYTE;
int Count(BYTE v)
{
int num = 0;
while(v)
{
if(v%2==1)
num++;
v=v/2;
}
return num;
}
int main()
{
BYTE b1 = 0;
BYTE b2 = 129;
BYTE b3 = 255;
printf("b1 :%d\n",Count(b1));
printf("b2 :%d\n",Count(b2));
printf("b3 :%d\n",Count(b3));
return 0;
}
好方法:
右移操作同样可以达到相除的目的。
右移后,与00000001进行“与”操作。
int Count(BYTE v)
{
int num = 0;
while(v)
{
num+=v&0x01;
v>>=1;
}
return num;
}
聪明方法:
虽然使用位操作的效率比笨方法高多了,但是,时间复杂度仍为O((log2)v)。
想办法使时间复杂度只与“1”的个数相关。
若v为:01000000,则v-1为:00111111。两者相与为0。
若v为:01100000,则v-1为:01011111。两者相与为01000000。此时和第一种情况一样。再次操作后,为0。
所以,根据这个规律,我们考虑v和v-1相与,统计结果为0之前的次数即为“1”的个数。
int Count(BYTE v)
{
int num = 0;
while(v)
{
v&=(v-1);
num++;
}
return num;
}
此外,还有空间换时间的方法。
将所有的256种情况存储在数组中。
根据v的不同,直接取相应的情况即可。
算法时间复杂度仅为O(1)。
相关文章推荐
- 求一个二进制数中"1"的个数
- TabIndex 属性 Tabindex="-1" 与Tabindex="0"、任意数字
- 话说神奇的content="IE=edge,chrome=1"的meta标签内容
- 详解< meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- ORA-16179: incremental changes to "log_archive_dest_1" not allowed with SPFILE
- SQL6031N 在 db2nodes.cfg 文件的行号"1" 上出错。原因码为"10"。
- linux shell 中"2>&1"含义
- window.frames["Iframe1"].document.location兼容问题
- "ROWNUM = 1"会使SQL的性能更快?
- 经纬纵横五阵图:架构蓝图---软件架构 "4+1" 视图模型
- Java编码转换问题,new String(str.getByts("ISO8859-1"), "GBK")的作用
- 正则表达式问题:如何理解/href\s*=\s*(?:"(?<1>[^"]*)"|(?<1>\S+))/(转载)
- 数组var _list:Array = new Array({logType:"1"});
- HTML中<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">理解
- SQL6031N 在 db2nodes.cfg 文件的行号"1" 上出错。原因码为"10"。
- linux shell 中"2>&1"含义
- PostgreSQL创建数据库时报错:ERROR: source database "template1" is being accessed by other users
- input file控件限制上传文件类型 网页上添加一个input file HTML控件: 1 <input id="File1" type="file" /> 默认是这样的,所有文件类
- new String(request.getParameter("newdefrayItem").getBytes("iso-8859-1"),"GBK")