对于Java中的某些散列函数,将值视为无符号整数(例如,与其他实现进行比较)会很好,但Java仅支持有符号类型.我们可以将签名转换为int"未签名" long,如下所示:
public static final int BITS_PER_BYTE = 8;
public static long getUnsignedInt(int x) {
ByteBuffer buf = ByteBuffer.allocate(Long.SIZE / BITS_PER_BYTE);
buf.putInt(Integer.SIZE / BITS_PER_BYTE, x);
return buf.getLong(0);
}
getUnsignedInt(-1); // => 4294967295
Run Code Online (Sandbox Code Playgroud)
但是,这个解决方案对我们真正做的事情来说似乎有些过分.有没有更有效的方法来实现同样的事情?
我想将float值的符号作为int-1或1 的值.
避免条件总是降低计算成本的好主意.例如,我能想到的一种方法是使用快速bit-shift获取标志:
float a = ...;
int sign = a >> 31; //0 for pos, 1 for neg
sign = ~sign; //1 for pos, 0 for neg
sign = sign << 1; //2 for pos, 0 for neg
sign -= 1; //-1 for pos, 1 for neg -- perfect.
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
int sign = (~(a >> 31) << 1) - 1;
Run Code Online (Sandbox Code Playgroud)