【问题标题】:'>>>' Java to C++ [duplicate]'>>>'Java 到 C++ [重复]
【发布时间】:2012-05-01 23:34:14
【问题描述】:

可能重复:
What is >>> operation in C++

我需要将Java的这一小部分转换为C++,但不知道'>>>'是什么......搜索了,但没有找到参考,只有在班次。 有人有什么想法吗?

int x1;

x1 = text1[i1++] & 0xff;

text2[i2++] = (char) (x1 >>> 8); 

【问题讨论】:

  • 它是 unsigned 右移运算符。我真的不确定 C++ 等价物是什么......

标签: c++ shift


【解决方案1】:

无符号右移 (>>>) 在 C++ 中不存在,因为它不是必需的 - C++ 具有不同的有符号和无符号整数类型。如果您希望右移是无符号的,请将正在移动的变量设为无符号:

unsigned int x1 = text1[i1++] & 0xff;
text2[i2++] = (char) (x1 >> 8);

话虽如此,您正在翻译的代码很愚蠢。在 Java 中,第二个操作的结果将始终为零,因此您可以轻松地将其转换为:

i1++;
text2[i2++] = 0;

【讨论】:

  • 我很确定这不是真的:演员表不会神奇地影响它所应用的表达式的“上下文”。
  • 这确实是重复的帖子,我很抱歉。正确的做法是:text2 [i2 + +] = (char) (unsigned int) (x1 >> 8);或 text2 [i2 + +] = (char) ((unsigned int) x1 >> 8);
  • 糟糕——我错过了在轮班前转换为无符号的过程。我很抱歉。
  • 它实际上是一套运行多线程的测试,需要转换此代码以在并行虚拟机上执行一些测试。我正在使用来自www2.epcc.ed.ac.uk/computing/research_activities/java_grande/…
  • @Daniel:接受答案然后试图告诉我们评论中的正确方法有什么意义?黄昏是正确的,而你的评论是错误的 - (char)(unsigned int)(x1 >> 8) 是浪费时间......在转换发生后,无论x1 是什么类型,这些转换都是无用的.
【解决方案2】:

C 中的等价物是:

unsigned int x1;

x1 = text1[i1++] & 0xff;

text2[i2++] = (unsigned char)(x1 >> 8)

在 C 中,如果它正在操作的变量是有符号的,则移位运算符会将 1 从符号位拖过来,否则它将像 java 无符号移位一样。

【讨论】:

    【解决方案3】:

    Java 中的 >>> 运算符是 logical shift 等效于 C++ 中 unsigned 类型的 >> 运算符。它将零移到左侧的空位位置。在有符号类型上,右移是逻辑还是arithmetic 由实现定义,因此您需要从一开始(或强制转换)使用无符号类型:

    unsigned int x1;
    x1 = text1[i1++] & 0xff;
    text2[i2++] = static_cast<char>(x1 >> 8);
    

    当然,这段代码似乎没有多大意义——x1 只有 8 个非零位,因为它被 0xff 屏蔽了,所以将其右移 8 位结果为零。

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2010-11-08
      • 2016-07-29
      • 2013-09-20
      • 2014-11-26
      • 2011-12-01
      • 2010-10-06
      • 2010-09-26
      • 2012-06-06
      相关资源
      最近更新 更多