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));
}