直接上代码,代码中注释标出算法的特点
package EveryTest.EveryBasic;
/**
*
* 统计int型数据中有多位是1
*
* @author
* @date 2020/4/28
*/
public class BinaryTest {
public static void main(String[] args) {
int num = 11;
int count1 = countIntBinaryBitIsOneMethod1(num);
System.out.println(count1);
int count2 = countIntBinaryBitIsOneMethod2(num);
System.out.println(count2);
}
/**
*
* 第一种算法,根据向右移的特点,如果移掉的是1,那么未移动前的数据就是新数据的2倍+1
*
* 缺陷:
* 由于最高位是符号位,如果最高位时1的话,那么通过这种算法进行计算会出现错误结果
* @param num
* @return
*/
private static int countIntBinaryBitIsOneMethod1(int num) {
int count = 0;
int temp;
while (true) {
if (num == 0) {
break;
}
if (num == 1) {
count++;
break;
}
temp = num;
num = num >> 1;
// 判断被移走的那一位二进制位是否为1
if (2 * num + 1 == temp) {
count++;
}
}
return count;
}
/**
* 第二种算法,根据&按位与的特点,那数字与1进行&,如果还是1,那么说明最低位是1
* @param num
* @return
*/
private static int countIntBinaryBitIsOneMethod2(int num) {
int count = 0;
while (true) {
if (num == 0) {
break;
}
if ((num & 1) == 1) {
count++;
}
num = num >> 1;
}
return count;
}
}
----------------------------
运行结果:
3
3
网友评论