- 浏览: 235203 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
cherami:
解法3有问题,在n很大的时候会导致baseNum溢出使得结果不 ...
阶乘算法之一N! 末尾有多少个零 -
yubenjie:
我怎么没看出多线程啊,就单线程再跑嘛
多线程编程之理财 -
fei229670104:
多线程 不错
多线程编程之理财 -
fei229670104:
liujiafei_2007 写道你好,问个问题,取钱时不用判 ...
多线程编程之存钱与取钱 -
liujiafei_2007:
你好,问个问题,取钱时不用判断取出的金额是否大于账户的余额吗? ...
多线程编程之存钱与取钱
解法一:
对于一个正整数如果是偶数,该数的二进制数的最后一位是 0 ,反之若是奇数,则该数的二进制数的最后一位是 1 。因此,可以考虑利用位移、判断奇偶来实现。
public int bitCount(int x){ int count = 0; while(x!=0){ if(x%2!=0){ //判断奇偶数 count++; } x = x>>>1; } return count; }
解法二:
知道了位移操作同样可以判断奇偶,且效率高于除法操作(“ % ”求余操作最后还是化为除法操作)那就可以用位移来代替上的求余运算。
因为 x & 1 的结果为 1 或 0 ,为 1 的时候 count+=1 ,为 0 的时候 count+=0
则:
If(x&1==1){
count++;
}
可简化为: count+ = x&1;
public int bitCount2(int x){ int count = 0; while(x!=0){ count+ = x&1; x = x>>>1; } return count; }
解法三:
正整数的二进制数最高位为 0 ,负整数和二进制数最高们为 1 ,则可利用左移、判断正负来实现 1 的个数的计算。
public int bitCount3(int x){ int count = 0; while(x!=0){ if(x<0){ count++; } x = x<<1; } return count; }
解法四:
前面的三种解法,运算的次数为二进制数的位数,时间复杂度仍为 O(log2 v) ,然而我们要计算 1 的个数,若让算法的运算次数只与“ 1 ”的个数有关,那复杂度就能进一步降低。
思想: x & (x-1) 可以消去 x 二进制数的最后一位 1
public int bitCount4( int x ) { int count = 0; while ( x != 0 ) { x &= x - 1; count++; } return count; }
解法五:
JAVA 的 JDK 库里 Integer 有个 bitCount 方法,其代码是这样实现的
private int pop(int x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x = x + (x >> 8); x = x + (x >> 16); return x & 0x0000003F; }
==============================================================
二分法,两两一组相加,之后四个四个一组相加,接着八个八个,最后就得到各位之和了。
第一行是计算每两位中的
1
的个数
,
并且用该对应的两位来存储这个个数
,
如
: 01101100 -> 01011000 ,
即先把前者每两位分段
01 10 11 00 ,
分别有
1 1 2 0
个
1,
用两位二进制数表示为
01 01 10 00,
合起来为
01011000.
第二行是计算每四位中的
1
的个数
,
并且用该对应的四位来存储这个个数
.
如
: 01101100
经过第一行计算后得
01011000 ,
然后把
01011000
每四位分段成
0101 1000 ,
段内移位相加
:
前段
01+01 =10 ,
后段
10+00=10,
分别用四位二进制数表示为
0010 0010,
合起来为
00100010 .
下面的各行以此类推
,
分别计算每
8
位
,16
位
,32
位中的
1
的个数
.
将
0x55555555, 0x33333333, 0x0f0f0f0f
写成二进制数的形式就容易明白了
.
解法六:
HAKMEM 算法
private int pop2(int x) { int n; n = (x >> 1) & 033333333333; x = x - n; n = (n >> 1) & 033333333333; x = x - n; x = (x + (x >> 3)) & 030707070707; x = x%63; return x; }
首先是将二进制各位三个一组,求出每组中 1 的个数,然后相邻两组归并,得到六个一组的 1 的个数,最后很巧妙的用除 63 取余得到了结果。
因为 2^6 = 64 ,也就是说 x_0 + x_1 * 64 + x_2 * 64 * 64 = x_0 + x_1 + x_2 (mod 63) ,这里的等号表示同余
参考资料:
1. http://blog.csdn.net/justpub/article/details/2292823
2. http://www.inwap.com/pdp10/hbaker/hakmem/hacks.html#item169
3. http://tekpool.wordpress.com/category/bit-count/
4. gurmeet.net/puzzles/fast-bit-counting-routines/
5. http://www.tekpool.com/node/2675
6. http://hi.baidu.com/rangemq/blog/item/9f918c8f83997eecf11f367b.html
8. http://mindprod.com/jgloss/bitcount.html
发表评论
-
Enum的深入浅出
2015-06-18 09:34 1480还记得上一篇是如何运用Enum来定义一周的的吗? ... -
JAVA中的Enum
2015-06-17 14:41 1388Enum是计算机编程语言中的一种数据类型---枚举类型。在实 ... -
多线程篇之二JAVA多线程之概念篇
2014-02-24 16:10 1661一:JAVA中的线程 在java中线程的应用类主 ... -
多线程篇之一 概念与原理
2014-02-24 15:47 1894一:线程 线程(英语:thread)是操作系统能够进行运 ... -
JAVA深入浅出流之二字节流
2014-01-14 13:59 2472在《 ... -
JAVA深入浅出流之一IO流
2014-01-14 11:39 4914工作三年了,可自己对文件读写还是一知半解,写代码的时候都不 ... -
JAVA Annotation之定义篇
2013-12-15 14:38 1890Annotation: 译为注释或注解 An a ... -
阶乘算法之一N! 末尾有多少个零
2013-06-07 16:32 7933... -
算法之时间复杂度
2013-06-07 15:11 3067在计算机科学中,算法的时间复杂度是一个函数,它定量描 ... -
JAVA 静态变量与非静态变量初始化顺序之新解
2012-12-28 16:43 3926今天和同事争论一问题,关于静态变量与非静态变量的初始化顺序,谁 ... -
求最大公约数之四部曲
2012-07-26 18:35 1959解法一: 欧几里得算法 ( 又称辗转 ... -
《编程之美》--中国象棋将帅问题
2012-07-20 14:16 2850最近在看微软研究院出版的《编程之美》一书,对于该书中提到的一些 ... -
java 位移运算与乘法运算
2012-07-09 14:25 5466对于 JAVA 编程中,适当的采用位移运算,会减少代 ... -
Java 求素数运算
2012-06-26 16:06 2286网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码 ... -
JAVA海量数据处理之二(BitMap)
2012-06-20 18:07 12109路漫漫其修远兮,吾将上下而求索。想要更快 ... -
海量数据处理之一
2012-06-18 18:37 2840... -
HTTP 协议通信
2012-01-18 18:11 1854一:简介 ... -
Java 字节码之解析一
2011-12-01 15:20 5048一: J ... -
Java常用工具--jps
2011-10-30 18:24 2038jps-虚拟 ... -
Map 与 JavaBean之间的转换
2011-10-26 19:55 3541最近项目里需要一个工具类,它的功能是传入一个Map后 ...
相关推荐
### 求二进制数中1的个数 #### 背景介绍 在计算机科学领域,理解和操作二进制数是非常基础且重要的技能之一。对于一个字节(8位)的变量,求其二进制表示中“1”的个数是一个常见的问题。这一问题不仅出现在计算机...
在Android开发中,我们经常会遇到各种算法挑战,其中之一就是如何计算一个十进制数N的二进制表示中“1”的个数。这个任务看似简单,但其实涉及到计算机科学的基础知识,包括二进制转换、位操作以及算法设计。下面...
printf("\n数字%d的二进制数中,0的个数为%d个,1的个数为%d个\n", nData, nSum_Zero, nSum_One); return 1; } ``` **代码解析:** - **主函数**:`main()`函数首先定义了一个整数变量`nData`并赋值为300,然后...
3. **统计1的个数及其位置**:在二进制表示中,记录下所有1出现的位置,并按顺序输出这些位置。 #### 2.2 C语言实现 下面是基于以上思路的具体C语言代码实现: ```c #include int main() { int d, n, a[20], i, ...
"判断32位无符号整数二进制中1的个数" 本资源主要介绍了在32位无符号整数二进制中统计1的个数的四种方法。 方法一:逐位比较法 该方法的思路是通过逐位比较来统计1的个数。代码如下: ```c int findone(unsigned ...
标题与描述均提到了在汇编语言中,如何将DX寄存器中的二进制数(3F2EH)以十六进制的形式显示在屏幕上,并随后进行换行操作,以及统计该二进制数中“1”的个数,将结果保存在BL寄存器,并同样显示在屏幕上。...
当我们谈论一个整数在二进制中的1的个数时,实际上是在寻找它的二进制表示中1的出现次数。这个问题在实际编程中经常遇到,尤其是在算法和数据结构的题目中,比如LeetCode上的这个题目。 给定的描述要求我们实现一个...
统计整数的二进制表示形式中有几个1(java实现),代码中有三种方法,分别是利用除、余的方法,位运算,以及利用“与”运算的方法。其中第三种方法效率最高,二进制数中有几个1,算法中的循环内的运算就执行几次。
二进制中1的个数.md
汇编实现统计输入数据中1的个数,转换为二进制判断
Delphi - 判断一个二进制数中有多少个1.mht
当我们谈论“二进制中1的个数”时,我们指的是一个给定二进制数中1的总数。这个信息在计算、编码和算法分析中都有重要的应用,特别是在面试和算法测试中经常被提及。 首先,介绍一种常见的方法来计算二进制中1的...
java基础面试题二进制中1的个数本资源系百度网盘分享地址
二进制位不同的个数 Time Limit:1000MS Memory Limit:65536KB Total Submit:16 Accepted:9 Description 对于两个非负整数x 和y,函数f(x,y) 定义为x 和y 在二进制表示时,其对应位不同的个数。例如,f(2,3)=1, f...
c++ c++_剑指offer题解之二进制中1的个数
15. 二进制中 1 的个数题目链接牛客网题目描述输入一个整数,输出该数二进制表示中 1 的个数。解题思路n&(n-1) 位运算可以将 n 的位级表示中最低的那
801. 二进制中1的个数算法:#位运算每次减去给定整数 x 二进制中的最后一位 1(lowbit(n) = n & -n),一共能减几次 x 二进制中就有几个
1.4 一题三解:二进制中1的个数.mp4
在计算机科学领域,统计一个数二进制表示中1的个数是一个常见的操作,被称为“位计数”或“ Hamming重量”。这个任务在很多算法和数据结构问题中都有应用,比如哈夫曼编码、数字签名、计算数字的奇偶性等。本课程...