public static void main(String[] args) {
System.out.println(add(5));
}
public static String add(float num){
return "float";
}
public static String add(double num){
return "double";
}
public static String add(short num){
return "short";
}
public static String add(long num){
return "long";
}
当传入整数字面量5时,默认为int类型。在方法重载的情况下,Java会按照"最小代价"的原则选择最合适的方法。对于int类型的参数来说,转换优先级为: int -> long -> float -> double 或者 int -> short
由于int转换为short可能会损失精度(因为short的取值范围比int小),所以系统会优先选择int转换为long的方法调用。因此会调用参数类型为long的方法,输出"long"。
汉明重量的计算
汉明重量:指一串符号中非零符号的个数
也就是其中二进制形式中 1的个数
一般我们直接 一位一位地去看每一位字符具体是0还是1,这样时间复杂度是 ,是这个数二进制的位数
但我们还有更优的方法
我们可以给原二进制中的相邻位数分组,
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
如 15(1 1 1 1)
变为 0 1 0 1(已经把偶数位的1隐去)
0 1 0 1(已经把奇数位的1隐去,已经与上边对齐,因为相邻位要同组加)
二者直接相加就可以得出每个分组中1的个数,结果可用 2bit来表示,不会溢位,因为在处理时已经保证其是01交替
二者相加后 1 0 1 0(现在每两位其二进制代表 1的个数)
那么我们就可以让相邻的四位为一组,再去计算 其中 1的个数
如此反复 8位 16 32......
我们只需 log(原数二进制的位数)次就可以快速求出 原始数中1的个数
而且每一步加法的计算都可以按照分组并行计算,性能更优!
#include "stdio.h"
int Function(unsigned int n) {
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return n;
}
void main() {
printf("%ld\n",Function(197));
}

京公网安备 11010502036488号