java - 转调 8XB 位

标签 java

我正在尝试转置 8X8 位数组。 Transpose(A) 正在工作,但 Transpose(Transpose(A) 对于某些示例不起作用。我知道需要对有符号字节进行一些处理。但不确定如何执行此操作。下面是不起作用的代码一些例子。有人可以帮助我吗?

<pre><code> 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); } } </code></pre>


下面是输出

Printing A. A Holds the letters SUDHAKAR<br/> <br/> 01010011<br/> 01010101<br/> 01000100<br/> 01001000<br/> 01000001<br/> 01001011<br/> 01000001<br/> 01010010<br/> <br/> Transposing A..<br/> <br/> 00000000<br/> 11111111<br/> 00000000<br/> 11000001<br/> 00010100<br/> 01100000<br/> 10000101<br/> 11001110<br/> <br/> Transposing B..<br/> <br/> 11111111<br/> 11111111<br/> 11101110<br/> 11101110<br/> 11101111<br/> 11101111<br/> 11101111<br/> 11111110<br/>

最佳答案

问题可能出在这两行

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

关于java - 转调 8XB 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925333/

相关文章:

java - Java代码中的奇怪输出(方形符号)

java - 无效的正则表达式 : illegal repetition in Java

java - 通过 TLS/SSL 将 RESTHeart 连接到 MongoDB

java - 有什么方法可以将 @XmlElement List<String> fieldName 编码(marshal)至 <fieldName xsi :nil ="true". ../> 而不是缺失的节点?

java - 调用 setOnItemClickListener 时出现空指针异常

java - 如何使用Gradle自动下载javadoc?

java - 如何判断jmenuitem是否是分隔符

java - gradle 中单个复制任务中的多个复制规范(嵌套复制规范)

java - 使用 HttpURLConnection 获取带有自签名证书的页面

java - 如何在Java中将 ""(空格)存储在 `int`数组中