2009-10-13 321 views
1

我需要把這段代碼轉換(在C++)成Java代碼:Java的C++代碼轉換

short i; 
    short j; 
    short k; 
    short result; 
    unsigned short m_table[ 256 ] 

    for (i = 0 ; i < 256 ; i++) 
    { 
     k = i << 8; 
     result = 0; 
     for (j = 0 ; j < 8 ; j++) 
     { 
      if ((result^ k) & 0x8000) 
       result= (result<< 1)^0x1021; 
      else 
       result<<= 1; 
      k <<= 1; 
     } 
     m_table[ i ] = (unsigned short) result; 
    } 

...但我從來沒有得到相同的結果...

我的Java代碼是:

int i; 
int j; 
int k; 
int result; 
int m_table[ 256 ] = new int[256]; 

for (i = 0 ; i < 256 ; i++) { 
    k = (i << 8); 

    result = 0; 

    for (j = 0 ; j < 8 ; j++) { 

     if (((result^ k) & 0x8000) != 0) 
      result= ((result<< 1)^0x1021); 
     else 
      result<<= 1; 

     k <<= 1; 
    } 

    m_table[ i ] = (result); 
} 
+10

你目前的Java代碼?你能粘貼嗎? – 2009-10-13 17:43:51

+1

你可能由以下事實得到位有作爲Java中的無符號短沒有這樣的事情。 – Gandalf 2009-10-13 17:46:24

+0

我怎樣才能將短變成無符號短 – Arutha 2009-10-13 17:58:06

回答

5

你需要小心Java的位操作。 Java沒有任何未簽名的類型,所以你可能需要使用比無符號類型更大的類型。

+0

這是一個很好的觀點。在這種情況下,'unsigned short'應該可以替換爲'int'。除此之外,我認爲C++是全部有效的Java。 – 2009-10-13 17:50:02

1

在JVM大端?如果使用常量0x0080和0x2110會發生什麼?

+0

討論JVM的字節順序:http://www.velocityreviews.com/forums/t548186-endianness-of-java-virtual-machine.html – 2009-10-13 17:52:37

+0

@Thomas:簡單的「是」或「否」就足夠了。 ;) – jalf 2009-10-13 18:07:33

+0

我認爲討論被連接而不是答案,因爲在Java的情況下問題是一個加載的問題。 – 2009-10-13 18:17:24

1

Java在int s或long s(如果存在)上進行整數運算,因此您需要將結果計算回short。也沒有從整數到布爾值的自動轉換。離開大括號是有點忌諱。所以:

 if ((result^ k) & 0x8000) 
      result= (result<< 1)^0x1021; 
     else 
      result<<= 1; 

應該改爲:

 if (((result^k) & 0x8000) == 0) { 
      result <<= 1; 
     } else { 
      result = (short)((result<<1)^0x1021); 
     } 

unsignedunsigned short應該去(沒有在Java中幾乎無符號,雖然你可以使用char)。 Java具有可靠範圍和整數類型行爲的優點。如果您的意思是16位,請堅持使用short。前16位將讀出& 0xffff時被刪除,但仔細。原始的C(或「C++」)代碼不可移植。

2

正如其他人指出,正在增加m_table的尺寸的解決方案。但是,您需要在鑄造時小心謹慎,以保持其不帶符號。

簡單地做:

m_table[ i ] = (int)result; 

...例如,將結轉結果的符號位。所以如果簽名的短結果是-1,那麼當你真正想要的是0xffff時,m_table [i]將以-1結束。

解決影響:

m_table[ i ] = result & 0xffff; 

這應該給你籤短,無符號短投原相當於...將其存儲在一個int只是爲了維持無符號的煩躁。

0

你有,我相信這個問題是左移(< <int值超出unsigned short範圍。爲了解決問題,您需要將左移的結果屏蔽到範圍內。要使用的掩碼是0xFFFF。要記住的一點是,&是一個非常低優先級運營商,所以括號(他們中的很多)是爲了。 這是修改的例子。

final int m_table[ ] = new int[256]; 

    for (int i = 0 ; i < 256 ; i++) { 
     // OK not to mask the result of << here, we are in unsigned short range 
     int k = (i << 8); // BTW, terrible name for this variable 

     int result = 0; 

     for (int j = 0 ; j < 8 ; j++) { 

      if (((result^ k) & 0x8000) != 0) 
      { 
       result= (((result<< 1) & 0xFFFF)^0x1021); 
      } 
      else 
      { 
       result <<= 1;  // Change to 1-liner if you wish 
       result &= 0xFFFF; // 
      } 

      k <<= 1;  // Change to 1-liner if you wish 
      k &= 0xFFFF; // 
     } 

     m_table[ i ] = result; 
    }