将无符号类型的按位运算符迁移到java(没有无符号类型)

时间:2012-07-02 14:16:49

标签: java android c bitwise-operators unsigned

我正在将iOS应用迁移到Android。

此iOs应用程序使用类似uint32_t的类型。这是一个unsigned int 32,它在Java上不可用。

uint32_t range is 0 to 4,294,967,295.

int32_t can hold values from –2,147,483,648 to 2,147,483,647

我在Objective-C中有这段代码:

uint32_t vectorRxV1;
UInt16   xxsDas;

[ ... ]

UInt8 CM_L = (vectorRxV1 & 0xBB000000) >> 24;

还有:

uint32_t vectorTxV0 += ((vectorTxV1<<4) + VectorSelK0) ^ ((vectorTxV1>>5) + VectorSelK1);

还有:

Uint8 sincroRx = (sincroRx & 0xD9);
sincroRx = (sincroRx | 0xA2);

我不确定是否使用long代替uint32_t(或int代替UInt8,上面的代码会给出不同的值。

更新

我有这些运算符:>><<&^|

您怎么看?

2 个答案:

答案 0 :(得分:8)

为了减少无符号数据类型的缺失,Java引入了>>>运算符以进行右移,这不会对正在移位的值进行符号扩展。这是唯一一个因为数字被解释为已签名而受到影响的位操作。

如果您将所有uint32_t替换为int,并将“无符号”值的所有>>操作替换为>>>,则会在结果中获得相同的位模式你的运作。

答案 1 :(得分:1)

@dasblinkenlight对他的运营商等是正确的......

但是有一个注意事项。 java long是一个64位值,所以如果你真的想要32位无符号并希望使用64位值留下真正的32位移位,那么答案如下所示:

long myVar;

myVar = 0x00000000FFFFFFFF & (myVar << someAmount);