如何将下面的java代码转换为C ++。我知道我可以写
typedef unsigned char byte
因此需要注意,但我不明白|=
和<<=
的含义。如何替换final
public static final long unsignedIntToLong(byte[] b) {
long l = 0;
l |= b[0] & 0xFF;
l <<= 8;
(l >>> 4) & 0x0F;
如何在C ++中测试所有这些 - 我可以在进行转换时运行一些单元测试。
答案 0 :(得分:5)
首先,|=
是复合按位OR赋值。 a |= b
相当于a = a | b
,如果a
或b
中的某个位置位(或两者都有),则会设置每个结果位。
这是一个应用于每个位的真值表:
a | b | result
--------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1
其次,<<=
是相同的,但不是按位,而是向左移位。 AL1现有位向左移动该量,右侧用0填充。
101 << 1 == 1010
110 << 2 == 11000
final
与变量定义的C ++ const
相同。但是,如果要阻止函数被覆盖,则可以将final
标记到函数头的末尾,如果该函数也是一个虚函数(需要将其重写为第一名)。但这仅适用于C ++ 11。这是我的意思example。
最后,>>>
在Java中被称为unsigned right shift
运算符。通常,>>
将移位这些位,但保留最左边的位以保留数字的符号。有时可能不是你想要的。 >>>
会一直放0,而不是假设标志很重要。
但是,在C ++中,signed
是一个现实,它是变量类型的一部分。如果一个变量被签名,>>
将像Java那样向右移动,但如果变量是无符号的,它将像Java中的无符号右移(>>>
)运算符一样。因此,C ++只需要>>
,因为它可以推断出要做的事情。
答案 1 :(得分:3)
| =在两种语言中都是相同的:按位或应用于lhs变量,就像+ =一样。与&lt;&lt; =;相同它是移位位左操作符。
无符号长可能很棘手;在Java中没有这样的东西。
有CppUnit。尝试使用它。
答案 2 :(得分:0)
关于如何用C ++编写最终类没有直接的答案。谷歌将向您展示很多例子。例如私有constuctor或frend类。
|是OR运算符。所以例如0x10 | 0x10 = 0x11。
&LT;&LT;是bitshift运算符。因此,例如0b1&lt;&lt; 0b1 = 0b10,10 <&lt;&lt; 0 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(){
}
};