1

如何将下面的 Java 代码转换为 C++。我知道我可以写 typedef unsigned char byte,以便得到照顾,但我不明白|=and<<=是什么意思。以及如何替换final

public static final long unsignedIntToLong(byte[] b) {
          long l = 0;
          l |= b[0] & 0xFF;
          l <<= 8;
          (l >>> 4) & 0x0F;

如何在 C++ 中测试所有这些 - 在进行转换时是否可以运行一些单元测试。

4

3 回答 3

5

首先,|=是复合按位或赋值。a |= b等效于a = a | b,如果该位在ab被设置(或两者),则每个结果位都将被设置。

这是应用于每个位的真值表:

a | b | result
--------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1

其次,<<=是相同的,但不是按位或,而是向左移位。所有现有位都向左移动该数量,右侧用 0 填充。

101 << 1 == 1010
110 << 2 == 11000

final变量定义与 C++ 相同const。然而,如果你想防止一个函数被覆盖,你可以标记final到函数头的末尾,如果该函数也是一个虚函数(它首先需要被覆盖)。不过,这只适用于 C++11。这是我的意思的一个例子。

最后,在 Java>>>中称为运算符。unsigned right shift通常,>>将移位位,但保持最左边的位不变以保留数字的符号。有时这可能不是你想要的。>>>将一直放一个 0 ,而不是假设该符号很重要。

然而,在 C++ 中,signed现实是变量类型的一部分。如果变量是有符号的,>>它将像 Java 一样右移,但如果变量是无符号的,它将像>>>Java 中的无符号右移 ( ) 运算符一样工作。因此,C++ 只需要>>,因为它可以推断出要做什么。

于 2012-06-03T23:17:53.773 回答
3

|= 在两种语言中是相同的:按位或应用于 lhs 变量,就像 += 一样。与 <<=; 相同 它是左移运算符。

Unsigned long 可能很棘手;Java中没有这样的东西。

有 CppUnit。尝试使用它。

于 2012-06-03T23:17:11.293 回答
0

关于如何用 C++ 编写最终类没有直接的答案。不过,谷歌会向您展示很多示例。例如私有构造函数或朋友类。

| 是 OR 运算符。所以例如 0x10 | 0x10 = 0x11。

<< 是移位运算符。例如 0b1 << 0b1 = 0b10, 10 << 2 = 0b1000 等等。移位 1 会使您的值乘以 2。

例如:

class Converter{
public:
    static Converter * createInstance()
    {
        return new Converter;
    }

    long unsignedIntToLong(unsigned char *b){
        long l = 0;
        l |= b[0] & 0xFF;
        l <<= 8;
        //..
        return l;
    }
private:
    Converter(){

    }
};
于 2012-06-03T23:21:30.120 回答