答复:“判断一个整数的二进制位中有多少个1”的提问
2008-05-11 21:24
176 查看
朋友发来了一个链接,看来原来是很久之前写的一篇关于“判断一个整数的二进制位中有多少个1”的Blog,yjdlut问了关于第三种判断方法的原理。这里先把原文中的第三种方法列出来:
循环: x = x & ( x - 1 ); count++; 直到x为0为止。该方法的时间复杂度是O(m)
在此,不妨把x的二进制位表示为
x=an-1an-2...a0。
按从低位到高位的顺序,不失一般性,假设x的第i位为第一个为1的二进制位,即:ai=1。此时有:
x =an-1an-2...ai+1100...0 <1>
(x-1) =an-1an-2...ai+1011...1 <2>
很明显,从式1和式2可以得出,在第一次 x & (x-1) 后:
x=an-1an-2...ai+1000...0
之后重复同样操作,直到x的二进制位中没有1为止
从上面可以看出,每执行过一次 x & (x-1) 后,都会将x的二进制位中为1的最低位的值变为0,并记数加1。
目前而言,一个整数最大64bit,所有三种方法执行起来都可以认为是0(1)。
循环: x = x & ( x - 1 ); count++; 直到x为0为止。该方法的时间复杂度是O(m)
在此,不妨把x的二进制位表示为
x=an-1an-2...a0。
按从低位到高位的顺序,不失一般性,假设x的第i位为第一个为1的二进制位,即:ai=1。此时有:
x =an-1an-2...ai+1100...0 <1>
(x-1) =an-1an-2...ai+1011...1 <2>
很明显,从式1和式2可以得出,在第一次 x & (x-1) 后:
x=an-1an-2...ai+1000...0
之后重复同样操作,直到x的二进制位中没有1为止
从上面可以看出,每执行过一次 x & (x-1) 后,都会将x的二进制位中为1的最低位的值变为0,并记数加1。
目前而言,一个整数最大64bit,所有三种方法执行起来都可以认为是0(1)。
相关文章推荐
- 判断一个整数的二进制位中有多少个1
- Java 一个整数的二进制位有多少个1,哪些位是1
- java 程序题 递归算法 判断一个整数化成二进制之后有多少个1 (两种思路)
- 有2.5亿个整数存放在一个文件中,(已知内存容量没有此文件大)如何判断出这个文件中有多少个不相同的数。
- 判断一个整数的二进制数有多少个1
- 判断一个整数中有多少个1(二进制)--LeetCode 191
- 判断输入的一个整数有多少位是1,效率要高
- [LeetCode-191] Number of 1 Bits(判断一个整数中有多少个1)
- 判断一个整数转化成二进制有多少个1
- 如何判断一个整数的二进制中有多少个1
- 如何判断一个整数位的二进制中有多少个1
- 判断任意整数的二进制位中有多少个1
- 判断一个字符串有多少个字节(js、.net 、Oracle)(
- 162 1. 给一个有N个整数的数组S..和另一个整数X,判断S里有没有2个数的和为X
- 判断一个整数是否是7的倍数
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一, 现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- java 判断一个数是否为2的整数次幂方法
- 整除运算, 写一个程序,接收两个整数a和b,关判断a是否能被b整除,输出判断结果
- 【程序13】 题目:一个整数,它加上100后是一个完全平方数,再加上168 又是一个完全平方数,请问该数是多少?
- 给出一个整数,判断集合中是否存在子集之和等于该整数?