mig*_*ash 1 java bit-manipulation
可能重复:
将4个字节转换为int
我正在尝试使用这里找到的一些解决方案将4个字节打包到一个int中,但它似乎不适用于我的一个测试.
这是我正在使用的代码:
public static int pack(int c1, int c2, int c3, int c4)
{
return (c1 << 24) | (c2 << 16) | (c3 << 8) | (c4);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在像0x34,0x68,0x77和0x23这样简单的东西上使用它时,我得到了我所期望的:0x34687723.但是当我在0xBA,0xAD,0xBE和0xEF上使用它时,我得到了一些东西.有谁看到问题可能是什么?
编辑
上面的代码能够给我我想要的东西,我在下面提到的"错误值"只是以十进制形式表示0xBAADBEEF的另一种方式.
pack方法中的代码是正确的并保留所有位但由于结果存储在signed int中,当您尝试将其作为int打印或进行算术计算或与之进行比较时,会得到错误的结果.
int result = pack( c1, c2, c3, c4 );
System.out.println( "result=" + Long.toHexString( result & 0xffffffffL );
Run Code Online (Sandbox Code Playgroud)
这将int打印为unsigned int.
存储在Java int中的数字只能表示高达0x7fffffff(2147483647 Integer.MAX_VALUE)的正值,因为它是有符号类型(与所有Java数字类型一样),而在内部表示中,最高有效位用作符号位.
要保持大于您需要使用的正数值long:
public static long pack(int c1, int c2, int c3, int c4)
{
return ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4)) & 0xffffffffL;
}
Run Code Online (Sandbox Code Playgroud)
注意最后的显式long掩码操作,这是确保符号扩展不会导致负整数结果变为负long所必需的.
| 归档时间: |
|
| 查看次数: |
5730 次 |
| 最近记录: |