从短裤中得到 8 条短裤
Get 8 shorts from a 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
。
我有一个像这样的 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
。