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

Van*_*nel 2 c java android unsigned bitwise-operators

我正在将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
Run Code Online (Sandbox Code Playgroud)

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

uint32_t vectorRxV1;
UInt16   xxsDas;

[ ... ]

UInt8 CM_L = (vectorRxV1 & 0xBB000000) >> 24;
Run Code Online (Sandbox Code Playgroud)

并且:

uint32_t vectorTxV0 += ((vectorTxV1<<4) + VectorSelK0) ^ ((vectorTxV1>>5) + VectorSelK1);
Run Code Online (Sandbox Code Playgroud)

并且:

Uint8 sincroRx = (sincroRx & 0xD9);
sincroRx = (sincroRx | 0xA2);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

我有这些运营商:>>,<<,&,^|.

你怎么看?

das*_*ght 8

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

如果uint32_t用" int替换全部>>" 并替换"无符号"值上的所有操作>>>,您将在操作结果中获得相同的位模式.

  • 需要说明的是,`+`,`-`,`*`,`==`,`&`,`|`,```和`<<`对于有符号和无符号类型都是等价的.`/`,`%`,`>>`,`<`和`>`不是.(在紧要关头,如果你需要后面的任何一个操作,Guava的[`UnsignedInts`](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/primitives /UnsignedInts.html)有替代这些的方法.) (6认同)