二进制序列中1的个数
来源:互联网 发布:结构设计用到的软件 编辑:程序博客网 时间:2024/06/08 07:35
最容易想到方法的就是把二进制的每一位都拿出来与1进行比较,如果是1,就计数,这样就统计出来二进制序列中1的个数了。
完整代码:
<span style="font-size:14px;">#include<stdio.h>int count_one_bits(unsigned value){int count=0; while(value){ if(value%2 == 1) count++; value/= 2;}return count;}int main(){ unsigned int value;int count=0;{ printf(" 请输入一个数: "); scanf(" %d ",&value); count= count_one_bits(value); printf(" count=%d\n ",count); } return 0;}</span>然而,这种方法只能解决无符号运算,如果一个数为负数,这个运算就会出现问题。因此,为了解决带符号运算数的问题,第二种方法就出现了。
完整代码:
<span style="font-size:14px;">#include<stdio.h>int count_one_bits(int n){ int count = 0; int i = 0; for(i=0; i<32; i++) { if(n&1 == 1) count++; n>>1; }return count;}int main(){ int num = -1;int rem = count_one_bits(num); printf(" %d\n ",rem); return 0;}</span>
说明:&:按位与运算符,先把十进制数换为二进制数在进行逐位比较。
规则:有0得0,否则为1。
所以上述代码中n&1结果取决于n,如果n为1,结果为1,如果n为0,结果为0,这样就实现了1的个数统计。
>>运算符:带符号右移运算符,将一个二进制位的操作数按指定移动的位数向右移位,移出位被丢弃,左边移出的空位一律补0或者符号位。
例如:11>>2
11的二进制为0000 0000 0000 0000 0000 0000 0000 1011
把低位的两个数字移出,该数为正数,最高位补0,所以结果为0000 0000 0000 0000 0000 0000 0000 0010(2)。
这种运算方法显然必须要循环32次,如果这个二进制数只有几个1呢,这样运算明显就明显降低了运算效率,因此,我试想,可不可以用更少的循环次数来实现呢,所以就出现了第三种方法。完整代码:
<span style="font-size:14px;">#include<stdio.h>int count_one_bits(int n){ int count = 0; while(n) { count++; n=n&(n-1); }return count;}int main(){ int num = -1;int rem = count_one_bits(num); printf(" %d\n ",rem); return 0;}</span>
0 0
- 二进制序列中1的个数
- 求二进制序列中1的个数
- 返回参数二进制中1的个数、输出二进制序列
- 求一个数的二进制序列中1的个数
- 高效计算二进制序列1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- 二进制中1的个数
- android端 socket长连接 架构
- Python爬虫基础-1
- JavaScript中的Event事件对象详解
- Hadoop数据类型
- 轮播效果
- 二进制序列中1的个数
- XMLHttpRequest对象详解
- 阿里巴巴2014校招笔试题_时长问题
- 让你的代码量减少3倍!使用kotlin开发Android(一)
- C++学习日记
- 第七周--项目1-建立顺序环形队列算法库
- 计算机网络CRC校验
- Java之内存分析和String对象
- 自定义控件