Jas*_*n S 1 java math bit-manipulation
嗯.考虑一下这个程序,它的目标是找出获得整数的最后16位的最佳方法,作为有符号整数.
public class SignExtend16 {
public static int get16Bits(int x)
{
return (x & 0xffff) - ((x & 0x8000) << 1);
}
public static int get16Bits0(int x)
{
return (int)(short)(x);
}
public static void main(String[] args)
{
for (String s : args)
{
int x = Integer.parseInt(s);
System.out.printf("%08x => %08x, %08x\n",
x, get16Bits0(x), get16Bits(x));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我打算在get16Bits0中使用代码,但是我用Eclipse的编译器得到了"从必须转换为从int到int"的警告,这让我很怀疑,认为编译器可以优化我的"不必要的演员".当我使用Eclipse的编译器在我的机器上运行它时,我得到两个函数的相同结果,这些函数的行为与我的预期一致(测试参数:1 1111 11111 33333 66666 99999).这是否意味着我可以使用get16Bits0?(对未来的代码维护者提出适当的警告)我一直认为JRE和编译器行为都与算法无关,但是这种情况在某种程度上测试了我的信念.
好吧,首先警告是正确的,因为你总是可以通过算术转换"向上"移动.只有另一种方式需要转换,因为您可能会丢失数据(或浮点数的精度).
当你从int减少到short时,你必须通过使用强制转换表明它是故意的.但是当你将短值转换回int时没有危险,它会自动发生.
所以,你需要的只是
return (short) x;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3026 次 |
| 最近记录: |