标签:
要求:求二进制数中1的个数
/** * 计算二进制中1的个数 O(log2V) * @param v 10进制的数字 * @return 二进制中1的个数 */ public static int Count(int v) { int num = 0; while(0 != v) { if( 1 == v % 2) { num++; } v= v / 2; } return num; }
该算法的时间复杂度为 O(log2n)
/** * 使用位操作计算二进制中1的个数 *@param v 10进制的数字 * @return 二进制中1的个数 */ public static int Count2(int v) { int num = 0; while(0 != v) { num += v & 0x01; v = v >> 1; //v右移一位 } return num; }
虽然说,原理上,上面两种方式是一样的,但位操作比除、余操作的效率高了很多。但即使使用位操作,时间复杂度认为O(log2N)
/** * 与上面的类似,时间复杂度为O(M),M为v中1的个数 * @param v * @return */ public static int Count3(int v) { int num = 0; while(0 != v) { v &= v-1; num++; } return num; }
复杂度降低到了O(M),M为1的个数。
测试代码
public static void main(String[] args) { int num = CountOfOne.Count(11); System.out.println("二进制中1的个数为:" + num); num = CountOfOne.Count2(11); System.out.println("二进制中1的个数为:" + num); num = CountOfOne.Count3(11); System.out.println("二进制中1的个数为:" + num); }
结果:
二进制中1的个数为:3
二进制中1的个数为:3
二进制中1的个数为:3
标签:
原文地址:http://www.cnblogs.com/0201zcr/p/4635493.html