转置8XB位

时间:2013-11-12 09:25:15

标签: java

我试图转置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); } }
以下是输出

1 个答案:

答案 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);