作者:不言不语都可以温柔_631 | 来源:互联网 | 2023-01-17 11:31
我想00000000000000101
从这个输入中得到以下结果5
.
这是我的代码,它没有意义:
public static int get16Bits(int x)
{
System.out.println((x & 0xffff) - ((x & 0x8000) <<1));
return (x & 0xffff) - ((x & 0x8000) <<1);
}
我如何获得16位的整数值?
1> procrastinat..:
尝试稍微改变你的return语句:
public static String get16Bits(int x)
{
return (String.format("%016d", Integer.parseInt(Integer.toBinaryString(x))));
}
这应该对你有帮助.
2> dasblinkenli..:
第一部分是不言自明的:通过& 0xffff
屏蔽删除高16位.
减法(x & 0x8000) <<1
是一种技巧,可以在32位结果中保持16位数的正确符号:例如,0xffff
16位表示中的-1转换为0xffffffff
,在32位表示中也为-1.这比使用条件更好,因为它是无分支的.
你可以使用的另一个技巧是
(((x & 0xFFFF) <<16) >> 16)
这使得16位数的符号位"触摸"32位数的符号位,让右移对符号扩展结果.
注意:如果要查找数字的二进制String
表示,则只x & 0xffff
需要屏蔽,因为无论如何都会从字符串结果中删除高16位.此问答解释了如何获取具有适当前导零数的整数的二进制表示.
@android这是负五的正确的二进制补码表示:你将`0000000000000101`变为`1111111111111010`,并在结果中加上&#39;1`,产生`1111111111111011`