java - 从短裤中获得 8 条短裤

标签 java bit-manipulation bitwise-operators short

我有一个像这样的短数组a:

a = [ 16748, 
      26979, 
      25888, 
      30561, 
      115
    ] //in decimal

a = [ 0100000101101100, 
      0110100101100011, 
      0110010100100000, 
      0111011101100001, 
      0000000001110011
    ] //in binary

我想获得另一个由表示每个短路的每对位组成的短路数组b。 (解释起来很困难,但通过示例很容易理解)。

因此,对于数组a,我将获得数组b:

b = [ 01, 00, 00, 01, 01, 10, 11, 00, 
      01, 10, 10, 01, 01, 10, 00, 11, 
      01, 10, 01, 01, 00, 10, 00, 00, 
      01, 11, 01, 11, 01, 10, 00, 01, 
      00, 00, 00, 00, 01, 11, 00, 11
    ]

在伪代码中我想到这样做:

int lenght = (16/2) * a.length; //16*2 because I had short (16 bit) and I want sequences of 2 bit
short[] b = new short[length]; //I create the new array of short
int j = 0; //counter of b array
foreach n in a { //foreach short in array a
    for(int i = 16 - 2; i > 0; i-2) { //shift of 2 positions to right
        b[j] = ( (n >> i) & ((2^2)-1) ); //shift and &
        j++;
    }
}

我尝试将这个伪代码(假设它是正确的)翻译为 Java:

public static short[] createSequencesOf2Bit(short[] a) {
    int length = (16/2) * a.length; 
    short[] b = new short[length];

    for(int i = 0; i < a.length; i++) {
        int j = 0; 
        for(short c = 16 - 2; c > 0; c -= 2) {
            short shift = (short)(a[i] >> c);
            b[j] = (short)(shift & 0x11);
            j++;
        }
    }
    return b;
} 

但是如果我打印 b[] 我就得不到我想要的东西。 例如,仅考虑 a (16748 = 0100000101101100) 中的第一个短路。 我得到:

[1, 0, 16, 1, 1, 16, 17]

这是完全错误的。事实上我应该得到:

b = [ 01, 00, 00, 01, 01, 10, 11, 00,
      ...
    ] //in binary

b = [ 1, 0, 0, 1, 1, 2, 3, 0,
      ...
    ] //in decimal  

有人可以帮助我吗? 非常感谢。

<小时/>

这很奇怪。如果我只考虑 a 中的第一个短路并打印 b 我得到:

public static short[] createSequencesOf2Bit(short[] a) {
    int length = (16/2) * a.length; 
    short[] b = new short[length];

    //for(int i = 0; i < a.length; i++) {
        int j = 0; 
        for(short c = (16 - 2); c >= 0; c -= 2) {
            short shift = (short)(a[0] >> c);
            b[j] = (short)(shift & 0x3);
            j++;
        }
    //}
    for(int i = 0; i < b.length; i++) {
        System.out.println("b[" + i + "]: " + b[i]);
    }
    return b;
} 

b = [1 0 0 1 1 2 3 0 0 0 0 0 ... 0]

但是如果我打印这个:

public static short[] createSequencesOf2Bit(short[] a) {
    int length = (16/2) * a.length; 
    short[] b = new short[length];

    for(int i = 0; i < a.length; i++) {
        int j = 0; 
        for(short c = (16 - 2); c >= 0; c -= 2) {
            short shift = (short)(a[i] >> c);
            b[j] = (short)(shift & 0x3);
            j++;
        }
    }
    for(int i = 0; i < b.length; i++) {
        System.out.println("b[" + i + "]: " + b[i]);
    }
    return b;
} 

b = [0 0 0 0 1 3 0 3 0 0 0 0 ... 0]

最佳答案

我怀疑主要问题是您需要 & 0x3 而不是 & 0x11。请记住,0x 表示十六进制,因此 0x11 为您提供数字 17,而不是 3。或者您可以编写 0b11 来获取 11 二进制。

此外,正如评论中指出的,循环条件应该是 c >= 0,而不是 c > 0

关于java - 从短裤中获得 8 条短裤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805084/

相关文章:

c++ - 解码整数值

c++ - 如何写短这个 "or"语句是不是?

assembly - 使用按位运算仅反转二进制数的 MSB

从 C 中的字符串计算奇偶校验位

c - 我怎样才能屏蔽位?

java - 检查 BigDecimal 值是否在范围内

java - GWT Internet Explorer 缓存 AJAX 响应

java - 无法从 HttpURLConnection POST 方法获取响应

CSAPP : What should happen if I want to shift an 8-bit number 8 positions to the left

java - SWT 图像连接或平铺/马赛克