我想00000000000000101从这个输入中得到以下结果5.
这是我的代码,它没有意义:
public static int get16Bits(int x)
{
System.out.println((x & 0xffff) - ((x & 0x8000) << 1));
return (x & 0xffff) - ((x & 0x8000) << 1);
}
Run Code Online (Sandbox Code Playgroud)
我如何获得16位的整数值?
尝试稍微改变你的return语句:
public static String get16Bits(int x)
{
return (String.format("%016d", Integer.parseInt(Integer.toBinaryString(x))));
}
Run Code Online (Sandbox Code Playgroud)
这应该对你有帮助.
第一部分是不言自明的:通过& 0xffff屏蔽删除高16位.
减法(x & 0x8000) << 1是一种技巧,可以在32位结果中保持16位数的正确符号:例如,0xffff16位表示中的-1转换为0xffffffff,在32位表示中也为-1.这比使用条件更好,因为它是无分支的.
你可以使用的另一个技巧是
(((x & 0xFFFF) << 16) >> 16)
Run Code Online (Sandbox Code Playgroud)
这使得16位数的符号位"触摸"32位数的符号位,让右移对符号扩展结果.
注意:如果要查找数字的二进制String表示,则只x & 0xffff需要屏蔽,因为无论如何都会从字符串结果中删除高16位.此问答解释了如何获取具有适当前导零数的整数的二进制表示.
小智 1
我们可以尝试下面的代码,我们将使用 for 循环:
public void getBits(int number){
String bits = "";
for (int i = 0; i < 16; i++) {
bits = (number & 1) + bits;
number >>= 1;
}
System.out.println("The bits are " + bits);
}
Run Code Online (Sandbox Code Playgroud)