位级操作,从短值获得一点

4 java integer bit 16-bit

我想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位的整数值?

pro*_*tor 6

尝试稍微改变你的return语句:

    public static String get16Bits(int x)
    {
        return (String.format("%016d", Integer.parseInt(Integer.toBinaryString(x))));

    }
Run Code Online (Sandbox Code Playgroud)

这应该对你有帮助.


das*_*ght 5

第一部分是不言自明的:通过& 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位.此问答解释了如何获取具有适当前导零数的整数的二进制表示.

  • @android这是负五的正确的二进制补码表示:你将`0000000000000101`变为`1111111111111010`,并在结果中加上'1`,产生`1111111111111011` (2认同)

小智 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)