我正在将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
,上面的代码会给出不同的值。
更新
我有这些运算符:>>
,<<
,&
,^
和|
。
您怎么看?
答案 0 :(得分:8)
为了减少无符号数据类型的缺失,Java引入了>>>
运算符以进行右移,这不会对正在移位的值进行符号扩展。这是唯一一个因为数字被解释为已签名而受到影响的位操作。
如果您将所有uint32_t
替换为int
,并将“无符号”值的所有>>
操作替换为>>>
,则会在结果中获得相同的位模式你的运作。
答案 1 :(得分:1)
@dasblinkenlight对他的运营商等是正确的......
但是有一个注意事项。 java long是一个64位值,所以如果你真的想要32位无符号并希望使用64位值留下真正的32位移位,那么答案如下所示:
long myVar;
myVar = 0x00000000FFFFFFFF & (myVar << someAmount);