/**
* 计算指定数的二进制表示中1的个数
* @author Sking
*/
package 数字问题;
public class 二进制1数问题 {
/**
* 除法求指定数的二进制表示中1的个数
* @param v 指定数
* @return 指定数的二进制表示中1的个数
*/
public static int countOneInBinary0(int v) {
int num = 0;
while (v != 0) {
if (v % 2 == 1)
num++;
v /= 2;
}
return num;
}
/**
* 使用位操作求指定数的二进制表示中1的个数,
* 时间复杂度为O(log2(v)),即二进制的位数。
* @param v 指定数
* @return 指定数的二进制表示中1的个数
*/
public static int countOneInBinary1(int v) {
int num = 0;
while (v != 0) {
num += v & 0x01;
v >>= 1;
}
return num;
}
/**
* 通过只和二进制表示中为1的位进行判断来计算1的个数,
* 时间复杂度为O(M),M为二进制表示中1的个数。
* @param v 指定数
* @return 指定数的二进制表示中1的个数
*/
public static int countOneInBinary2(int v) {
int num = 0;
while (v != 0) {
v &= (v - 1);// 每统计一个“1”,也抹去1个“1”
num++;
}
return num;
}
/**
* 计算指定的两个数的二进制表示中有多少位是不同的
* @param w 第一个数
* @param v 第二个数
* @return 指定的两个数的二进制表示中不同的位数
*/
public static int diffCount(int w, int v) {
// 异或运算使得相同位为0,不同位为1
// 计算异或结果的二进制表示中1的个数
int num=0;
int u=w^v;
while(u!=0){
u&=u-1;
num++;
}
return num;
}
}
数字问题之二进制1数问题<Java实现>
最新推荐文章于 2020-04-30 22:01:17 发布