一个unsigned int 数的二进制表示中有多少个1
来源:互联网 发布:大型商场数据分析 编辑:程序博客网 时间:2024/05/21 11:25
第一种是很容易想到的采用循环的方式并且与1进行位与运算,具体代码如下。
10
11
13unsigned
15
16
17
18
19
20
21
22
23
这两种做法很相像,区别就是在对nBitMask进行左移还是对nValue进行右移。
当然了以上的两个方法存在一个问题:不管如何这个函数肯定要循环32次(对于32平台来说)。
那又没有更好的方法?当然有,请看下面:
假如使用参数12345(二进制是11000000111001)调用该函数,该函数的执行情况如下:
第一次进入循环
0 < 11000000111001
11000000111001 &= (11000000111001 - 1) 之后 nValue 的值是 11000000111000
nBitNum 的值是1
经过本次循环之后11000000111001 变成了 11000000111000 比之前少了一个1
第二次进入循环
0 < 11000000111000
11000000111000 &= (11000000111000 - 1) 之后 nValue 的值是 11000000110000
nBitNum 的值是2
经过本次循环之后11000000111000 变成了 11000000110000 比之前少了一个1
第三次进入循环
0 < 11000000110000
11000000110000 &= (11000000110000 - 1) 之后 nValue 的值是 11000000100000
nBitNum 的值是3
经过本次循环之后11000000110000 变成了 11000000100000 比之前少了一个1
经过以上3次循环情况的说明,我相信你一定看出了些什么吧。nValue &=(nValue -1),这句
代码实际上就是把nValue 的某位及其以后的所有位都变成0,当nValue最后变成0的时候循环结束,
且nBitNum 记录的就是1的个数。
上面的做法已经很不错了,但是作为程序员的你是否会有疑问,“还有其他的方法吗?”。
有,当然有!请看下面的代码:
假如你是第一次看到这些代码,你是否能看明白?呵呵,本人第一次看到这些代码的时候看了好久才感觉
好像有点明白。下面我就以一个例子来说明上面的代码是如何做到的。
假如参数是0xffffffff。
第一行代码:
nValue = ((0xaaaaaaaa &nValue)>>1) + (0x55555555& nValue);
a的二进制表示是:1010
5的二进制表示是:0101
0xffffffff 与 0xaaaaaaaa进行与运算之后是0x1010101010101010101010
然后再进行左移操作后是0x0101010101010101010101
0x55555555 & nValue进行与运算之后是0x0101010101010101010101
然后0x0101010101010101010101
得到0x1010101010101010101010
我们把得到的结果分成16组0x10
每组的10单独来看是不是十进制的2
我们0x0101010101010101010101
16个组0x01
那么这两个数的每一个组都是01 那么两个01里面有几个1,是不是2个。这是2是不是二进制的10,然后16个10组合起来是不是
0x1010101010101010101010
第二行代码:
nValue = ((0xcccccccc &nValue)>>2) + (0x33333333& nValue);
此时nValue是0x1010101010101010101010
c的二进制表示是:1100
3的二进制表示是:0011
0xcccccccc 与 nValue)进行与运算之后是0x1000100010001000100010
然后再进行左移操作后是0x0010001000100010001000
0x33333333 & nValue进行与运算之后是0x0010001000100010001000
然后0x0010001000100010001000
得到0x0100010001000100010001
我们把得到的结果分成8组0x0100 0100 0100 0100 0100 0100 0100 0100
每组的0100单独来看是不是十进制的4 总共有多少个4?是不是8个,8×4=32。
以下的代码:
请自己按照上面的方法做一遍,就会发现规律:第一次32位数分成32组,第二次分成16组,第三次分成8,第四次分成4,第五次分成2组。
如果还是不明白请多看看,然后多选择几个参数进行试验,多试几次肯定会明白的。
- 求一个unsigned int 数的二进制表示中有多少个1?
- 一个unsigned int 数的二进制表示中有多少个1
- 求一个unsigned int 数的二进制表示中有多少个1?
- 一道面试题(求一个unsigned int 数的二进制表示中有多少个1?)
- 求一个数的二进制表示中,有多少个1的问题
- 计算一个数的二进制表示中有多少个1
- 一个int数的二进制有多少个一
- 求一个数的二进制中有多少个一
- 整数的二进制表示中有多少个1
- 位操作:一个整数的二进制表示中 有多少个1?
- 输入一个整数,求该整数的二进制表示中有多少个1
- 统计一个自然数的二进制表示形式中有多少个1
- C程序:二进制表示中有多少个"1″;二进制表示中有多少位是不同的
- 计算一个数的二进制形式有多少个1
- 判断一个整数的二进制数有多少个1
- 如何判断一个数的二进制有多少个1
- 判断一个数的二进制有多少个1
- 如何判断一个数的二进制有多少个1
- linux c 文件打开并创建代码分析
- iOS 为移动动画中的View添加touch事件
- 百度地图API简单应用——1.根据地址查询经纬度
- C++ 我感觉好难! 这个不知道错字哪儿了!
- 【POJ】3308 Paratroopers 化乘为加——最小点权覆盖
- 一个unsigned int 数的二进制表示中有多少个1
- 我之见--java 线程
- poj 2482 Stars in Your Window
- poj 1276 Cash Machine
- A星(A*, A Star)算法详解
- Bull Math(高精度)
- jQuery - AJAX 读取text文本
- 机房收费系统(个人版)——实体和表的取舍
- 牛腩新闻发布系统总结