我试图转置8X8位阵列。 Transpose(A)正在工作但Transpose(Transpose(A)不能用于某些示例。我知道有些东西需要用有符号的字节来完成。但不知道如何做到这一点。下面的代码不能正常工作一些例子。有人可以帮助我吗?
public class BitTranspose
{
public static void main(String[] args)
{
byte A[] =new byte[]{'S','U','D','H','A','K','A','R'};
System.err.println("\nPrinting A. A holds the letters SUDHAKAR");
print(A);
byte B[]=new byte[A.length];
System.err.println("\nTransposing A..");
transpose(A,1,1,B);
print(B); // O.K
A=new byte[B.length];
System.err.println("\nTransposing B..");
transpose(B,1,1,A);
print(A); // Not O.K
}
public static void print(byte[] A)
{
System.err.println();
for(int i=0;i<A.length;i++)
{
System.err.println(toBinary(A[i]));
}
}
public static String toBinary(byte b)
{
String sb=new String();
for (int i=7; i>=0; i--)
{
sb=sb+((b >> i)&1);
}
return sb;
}
static void transpose(byte A[], int m, int n, byte B[])
{
int x, y, t;
x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
t = (x ^ (x >> 7)) & 0x00AA00AA;x = x ^ t ^ (t << 7);
t = (y ^ (y >> 7)) & 0x00AA00AA;y = y ^ t ^ (t << 7);
t = (x ^ (x >>14)) & 0x0000CCCC;x = x ^ t ^ (t <<14);
t = (y ^ (y >>14)) & 0x0000CCCC;y = y ^ t ^ (t <<14);
t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
x = t;
B[0]=(byte)(x>>24); B[n]=(byte)(x>>16); B[2*n]=(byte)(x>>8); B[3*n]=(byte)(x);
B[4*n]=(byte)(y>>24);B[5*n]=(byte)(y>>16);B[6*n]=(byte)(y>>8); B[7*n]=(byte)(y);
} }
public class BitTranspose
{
public static void main(String[] args)
{
byte A[] =new byte[]{'S','U','D','H','A','K','A','R'};
System.err.println("\nPrinting A. A holds the letters SUDHAKAR");
print(A);
byte B[]=new byte[A.length];
System.err.println("\nTransposing A..");
transpose(A,1,1,B);
print(B); // O.K
A=new byte[B.length];
System.err.println("\nTransposing B..");
transpose(B,1,1,A);
print(A); // Not O.K
}
public static void print(byte[] A)
{
System.err.println();
for(int i=0;i<A.length;i++)
{
System.err.println(toBinary(A[i]));
}
}
public static String toBinary(byte b)
{
String sb=new String();
for (int i=7; i>=0; i--)
{
sb=sb+((b >> i)&1);
}
return sb;
}
static void transpose(byte A[], int m, int n, byte B[])
{
int x, y, t;
x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
t = (x ^ (x >> 7)) & 0x00AA00AA;x = x ^ t ^ (t << 7);
t = (y ^ (y >> 7)) & 0x00AA00AA;y = y ^ t ^ (t << 7);
t = (x ^ (x >>14)) & 0x0000CCCC;x = x ^ t ^ (t <<14);
t = (y ^ (y >>14)) & 0x0000CCCC;y = y ^ t ^ (t <<14);
t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
x = t;
B[0]=(byte)(x>>24); B[n]=(byte)(x>>16); B[2*n]=(byte)(x>>8); B[3*n]=(byte)(x);
B[4*n]=(byte)(y>>24);B[5*n]=(byte)(y>>16);B[6*n]=(byte)(y>>8); B[7*n]=(byte)(y);
} }
以下是输出
答案 0 :(得分:3)
问题可能在于这两行
x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
因为在(A[m]<<16)
中,A[m]
首先进行符号扩展然后转移。如果A[m]
为负(即无符号大于127),则会破坏高位。
尝试将其更改为
x = (A[0]<<24) | ((A[m]&0xFF)<<16) | ((A[2*m] & 0xFF)<<8) | (A[3*m] & 0xFF);
y = (A[4*m]<<24) | ((A[5*m]&0xFF)<<16) | ((A[6*m] & 0xFF)<<8) | (A[7*m] & 0xFF);