2

我正在将 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);

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

更新

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

你怎么看?

4

2 回答 2

9

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

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

于 2012-07-02T14:24:32.797 回答
1

@dasblinkenlight 对他的操作员等是正确的......

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

long myVar;

myVar = 0x00000000FFFFFFFF & (myVar << someAmount);
于 2012-07-02T14:46:44.457 回答