2016-05-30 46 views
-3

我試圖使用大端表示點菜,以大量保存到一個文件:時髦的java按位操作?

[0-255] * 256^N

出於某種原因,當你轉向長期價值,Java的出現使第0級和第4個字節(1和第5 ...)相同

在這短暫的代碼片段的最後一列不應該大於(256 - 1)= 255

我知道Java不有無符號的值,但我不知道這個代碼有什麼問題,或者,我在這裏丟失了什麼

lbrtchx

import java.util.ArrayList; 

public class BigEndian02Test{ 
    public static void main(String[] aArgs){ 
    int m8; 
    long[] lBytL = new long[] { 1L, 256L, 65536L, 16777216L, 4294967296L, 1099511627776L, 281474976710656L, 72057594037927936L }; 
    long[] lBgEnd = new long[8]; 

    for(int i=0; (i < lBytL.length); ++i){ 
     for(long j =-1; (j < 2L); ++j){ 
      lVal = lBytL[i] + j; 
      System.err.println("// __ lVal: |" + lVal + "|"); 
      for(int m=0; (m < 8); ++m){ 
       m8 = m*8; 
       lBgEnd[m] = (long)((lVal & 0xFF) << m8); 
       System.err.println("// __ lBgEnd[" + m + "]: |" + lBgEnd[m] + "|" + (lBgEnd[m]/lBytL[m]) + "|"); 
      }// m 
      System.err.println("~"); 
     } 
    } 
} 
+2

請格式化你的代碼。並嘗試提供[MCVE](http://stackoverflow.com/help/mcve)。另外,如果問題是關於Java的,請刪除其他語言標記。 – Codebender

+0

MCVE的示例:代碼的第一個*半*簡單歸結爲:'long [] lBytL = new long [] {1L,256L,65536L,16777216L,4294967296L,1099511627776L,281474976710656L,72057594037927936L};'自從第一個你的一半代碼與你的問題無關,這就是MCVE中M(Minimal)的本質。 ---至於「格式化你的代碼」,這意味着使用4個空格而不是1個縮進來提高人的可讀性。 – Andreas

回答

1

你的問題是,你留下了一個表達高達operator precedence,你聽錯了。

移位<<>>>>>)具有比位與&)更高的優先級。

所以:

lVal & 0xFF << m8 

方式:

lVal & (0xFF << m8) 

你以爲這意味着:

(lVal & 0xFF) << m8 

添加括號,你的代碼將更好地工作。

UPDATE

其實,我覺得你真的打算這樣做:

​​

當然,如果你想要做的是轉換long陣列到大端字節訂單,請使用ByteBuffer

long[] lBytL = new long[] { 1L, 256L, 65536L, 16777216L, 4294967296L, 1099511627776L, 281474976710656L, 72057594037927936L }; 

ByteBuffer buf = ByteBuffer.allocate(lBytL.length * 8); 
buf.order(ByteOrder.BIG_ENDIAN); // This is the default, so call not necessary, but here for clarity 
for (long value : lBytL) 
    buf.putLong(value); 
byte[] bytes = buf.array(); 

打印結果在人類可讀的格式:

for (int i = 0; i < bytes.length; i++) { 
    System.out.printf("%02x ", bytes[i]); 
    if (i % 8 == 7) 
     System.out.println(); 
} 

打印:

00 00 00 00 00 00 00 01 
00 00 00 00 00 00 01 00 
00 00 00 00 00 01 00 00 
00 00 00 00 01 00 00 00 
00 00 00 01 00 00 00 00 
00 00 01 00 00 00 00 00 
00 01 00 00 00 00 00 00 
01 00 00 00 00 00 00 00 
+0

我沒有添加圓括號,但代碼現在不是「工作得更好」,現在所有256^n次移位後顯示爲0,並且還有一些其他類型的變暗 –

+0

謝謝安德烈亞斯。在這麼多的funkiness之後,我決定使用一個簡單的算術表示算法,這個簡單的kern看起來像: –

0

謝謝,安德烈亞斯。經過這麼多的funkiness之後,我決定使用一種簡單的算術表示算法。我想要的方式,不給我「驚喜」,當我將代碼移植到ANSI C,C++,所以我選擇了一個簡單,直接的代碼克恩的樣子寫的:

long[] lBytL = new long[] { 1L, 256L, 65536L, 16777216L, 4294967296L, 1099511627776L, 281474976710656L, 72057594037927936L }; 
boolean IsRng = false; 
for(int m = (lBytL.length - 1); (m > -1); --m){ 
    lPlc = (lVal/lBytL[m]); 
    iPlcVal[m] = (int)lPlc; 
    if(!IsRng && (lPlc > 0)){ iRgnIx = m; IsRng = true; } 
    lVal -= (lVal/lBytL[m])*lBytL[m]; 
}// m