2012-07-02 42 views
2

我正在将iOS应用程序迁移到Android。将无符号类型的按位运算符迁移到java(无无符号类型)

这个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,上面的代码会给出不同的值。

UPDATE

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

您认为如何?

+2

如果你已经决定留在C,那么这是一个问题了吗? – trumpetlicks

+0

按位运算符独立于符号运行,除了右移。使用前检查右移是算术还是逻辑。 – nhahtdh

+1

@trumpetlicks因为向左移不签名扩展。 – dasblinkenlight

回答

8

为了减轻无符号数据类型的缺失,Java引入了>>>运算符来右移,这不会对要移位的值进行符号扩展。这是唯一的操作,将遭受数字解释为有符号的事实。

如果更换所有uint32_tint,并与>>>取代的“无符号”值的所有>>操作,你会得到你的操作结果相同的位模式。

+6

要清楚,'+','-','*','' ==','&','|','^'和'<<'对于有符号和无符号类型都是等价的。 '/','%','>>','<', and '>'不是。 (如果你需要后面的任何操作,Guava的['UnsignedInts'](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/primitives /UnsignedInts.html)有方法来替代这些。) –

+0

感谢您的评论和答复。所以,我只需要用'>>>'改变'>>',并且使用'long'而不是'uint32_t'和'int'而不是'UInt8'来使它工作,不是吗? – VansFannel

+0

@VansFannel假设你正在对你的无符号数进行位操作,这是正确的。我将使用'short'而不是'int'作为我的8-bt整数值,因为'short'会给你两倍的范围。 – dasblinkenlight

1

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

但有一个注意。一个java长是64位的值,所以如果你真的想32位等值的签名,并想用一个64位值比答案看起来像如下留下了真正的32位移位:

long myVar; 

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