【问题标题】:C++ to Java porting code with bitwise operators and unsigned int使用按位运算符和无符号整数的 C++ 到 Java 移植代码
【发布时间】:2013-01-11 18:18:21
【问题描述】:

我需要将 C++ 代码翻译成 Java。我有两个担心的问题。

1) 将“unsigned int”从 C++ 转换为 Java 为“long”。 我选择使用 long 来增加存储容量。

2) 使用位运算符,特别是 |和

unsigned int a;
unsigned int b;
unsigned int c;

a | (b<<c)

在 Java 中可以这样做吗:

long a, b, c;

a | (b<<c)

请让我知道您认为我可能遇到的任何问题 做这些事情。

谢谢

【问题讨论】:

  • 你试过并检查了结果吗?
  • 当符号位变成 1 并咬住你时,你会很开心地调试代码。并不是说你做不到,而是要做到正确比看起来要难得多。 Java 中的位操作可能是一场噩梦。
  • 如果 unsigned int 在 C++ 中是 32 位的,那么 0x40000000 &lt;&lt; 2 在 C++ 中是零,但在 Java 中是非零 long

标签: java c++ porting


【解决方案1】:

它应该工作。请记住,Java long 是 64 位的。唯一真正的区别是 Java 整数是有符号的。

运算符的行为应该与无符号的相同: +-==&amp;|^&lt;&lt;

这些将改变行为: */%&lt;

使用&gt;&gt;&gt; 而不是&gt;&gt;/2**k 进行无符号解释(推送的位是0,而不是MSB 副本)。

【讨论】:

  • 如果这些值最初都是 32 位无符号的,则在放入 Java long 时它们将是正数。
  • @JamesKanze,是的,您可以使用signed longunsigned int 整数,但是对于许多操作,您必须屏蔽高部分。
  • 哪个?或者至少,您还没有屏蔽哪些操作?
【解决方案2】:

long 使用 Java 签名。

long 数据类型是一个 64 位有符号二进制补码整数。它有 最小值为 -9,223,372,036,854,775,808,最大值为 9,223,372,036,854,775,807(含)。

来自 C++ 的unsigned int 是一个字长(32 位机器上的 32 位)。它的范围从 0 到 4,294,967,295。

【讨论】:

  • unsigned int 必须至少为 16 位。除此之外,编译器可以而且确实会有所不同。
  • 除字符外的所有内容都在 java 中签名
  • unsigned int 是用 C++ 定义的实现。 (然而,我实际看到的最长的是 48 位。)
【解决方案3】:

我相信您所做的事情是安全的,并且应该在 Java 中运行良好。如您所见,使用的按位运算应该可以按预期工作。

【讨论】:

    【解决方案4】:
           Bitwise operations
    
      It's important to remember that the unsigned keyword affects 
      the interpretation, not the representation of a number. In other 
      words, in cases where we aren't interpreting a value arithmetically— so-called
      bitwise operations such as AND, OR, XOR— it makes essentially no 
      difference whether a value is marked as "signed" or "unsigned"
    

    。 unsigned int 等价于 java 中的 long。所以,它有所作为。 更多信息请参考here

    【讨论】:

    • @PeteBecker 您能否详细说明您认为该网站上有哪些错误信息?据我所知,那里的信息是可靠的(除了它们对不同的 C 实现具有不同大小的 int 以及他们的示例假设为 32 位 int 的事实不是非常明确)
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2010-12-19
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2014-05-02
    相关资源
    最近更新 更多