【问题标题】:Get 8 shorts from a short从短裤中获得 8 条短裤
【发布时间】:2016-03-04 20:02:43
【问题描述】:

我有一个数组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) 中的第一个short。 我得到:

[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 中的第一个 short 并打印 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]

【问题讨论】:

    标签: java bit-manipulation bitwise-operators short


    【解决方案1】:

    我怀疑主要问题是你想要&amp; 0x3 而不是&amp; 0x11。请记住,0x 表示十六进制,所以0x11 给你的数字是 17,而不是 3。或者你可以写 0b11 以得到二进制的 11

    此外,正如 cmets 中所指出的,循环条件应该是 c &gt;= 0,而不是 c &gt; 0

    【讨论】:

    • 其次循环条件错误:c &gt; 0,应该是`c >= 0`。
    • 好的,多亏了这两个,但现在我得到了b = [0 0 0 0 1 3 0 3 0 0 0 0 ... 0]
    • @Step 您的问题是因为您为数组中的每个元素重置了j,因此您只填充了数组中的前八个位置。
    • @Step : 在第一个循环之前移动int j = 0;
    猜你喜欢
    • 2012-02-12
    • 2012-08-04
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多