【问题标题】:Java C++ code conversionJava C++ 代码转换
【发布时间】:2009-10-13 17:42:36
【问题描述】:

我需要将此代码(在 C++ 中)转换为 Java 代码:

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

【问题讨论】:

  • 您当前的 Java 代码是什么?也可以粘贴一下吗?
  • 您可能会被 Java 中没有无符号短路这样的事实所困扰。
  • 我怎样才能把一个短的转换成一个无符号的短
  • 这是我的 Java 代码:int i;诠释 j;诠释 k;整数结果; int m_table[256] = 新的 int[256];对于 ( i = 0 ; i
  • 在我看来,这实际上看起来像是 C 代码,而不是 C++。

标签: java c++ porting


【解决方案1】:

在 Java 中,您需要小心使用位操作。 Java 没有任何无符号类型,因此您可能需要使用比使用无符号类型更大的类型大小。

【讨论】:

  • 这很好。在这种情况下,unsigned short 可能应该替换为int。除此之外,我认为 C++ 都是有效的 Java。
【解决方案2】:

正如其他人所说,增加 m_table 的大小是一种解决方案。但是,您需要在强制转换时小心以保持它未签名。

简单地做:

m_table[ i ] = (int)result;

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

使用以下方法修复:

m_table[ i ] = result & 0xffff;

这应该给你相当于原始的有符号短到无符号短转换......将它存储在一个 int 中只是为了保持无符号性。

【讨论】:

    【解决方案3】:

    JVM 是大端的吗?如果使用常量 0x0080 和 0x2110 会发生什么?

    【讨论】:

    • 关于JVM字节序的讨论:velocityreviews.com/forums/…
    • @Thomas:一个简单的“是”或“否”就足够了。 ;)
    • 我认为讨论是链接而不是答案,因为在 Java 的情况下这个问题有点复杂。
    【解决方案4】:

    Java 对 ints 或 longs(如果存在)执行整数运算,因此您需要将结果返回到 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);
            }
    

    来自unsigned shortunsigned 应该消失(Java 中几乎没有未签名,尽管您可以使用char)。 Java 的优点是具有可靠的范围和整数类型的行为。如果您的意思是 16 位,请坚持使用 short。前 16 位将被删除,但在读出 &amp; 0xffff 时要小心。原始 C(或“C++”)代码不可移植。

    【讨论】:

      【解决方案5】:

      我认为您遇到的问题是左移(int 值超出了unsigned short 范围。要解决此问题,您需要将左移结果屏蔽到范围内。要使用的掩码是 0xFFFF。要记住的是&amp; 是一个非常低优先级的运算符,所以括号(很多)是有序的。 这是修改后的示例。

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

      【讨论】:

        猜你喜欢
        • 2015-02-10
        • 2014-09-16
        • 2016-04-14
        • 2014-05-27
        • 2015-09-27
        • 2013-07-12
        • 2017-02-15
        • 1970-01-01
        • 2011-12-31
        相关资源
        最近更新 更多