Java的C++代码转换

问题描述:

我需要把这段代码转换(在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

你需要小心Java的位操作。 Java没有任何未签名的类型,所以你可能需要使用比无符号类型更大的类型。

+0

这是一个很好的观点。在这种情况下,'unsigned short'应该可以替换为'int'。除此之外,我认为C++是全部有效的Java。 – 2009-10-13 17:50:02

在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

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++”)代码不可移植。

正如其他人指出,正在增加m_table的尺寸的解决方案。但是,您需要在铸造时小心谨慎,以保持其不带符号。

简单地做:

m_table[ i ] = (int)result; 

...例如,将结转结果的符号位。所以如果签名的短结果是-1,那么当你真正想要的是0xffff时,m_table [i]将以-1结束。

解决影响:

m_table[ i ] = result & 0xffff; 

这应该给你签短,无符号短投原相当于...将其存储在一个int只是为了维持无符号的烦躁。

你有,我相信这个问题是左移(< <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; 
    }