2

iOS アプリを Android に移行しています。

この iOS アプリは、uint32_t のような型を使用します。これは、Java では使用できない unsigned int 32 です。

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代わりにaを使用するかどうかはわかりませんが、上記のコードでは異なる値が返されます。uint32_tintUInt8

更新

私はこれらの演算子を持っています:>>、、、、および。<<&^|

どう思いますか?

4

2 に答える 2

9

符号なしのデータ型が存在しないことを軽減するために、Java は>>>右にシフトするための演算子を導入しました。これは、シフトされる値を符号拡張しません。これは、数値が符号付きとして解釈されるという事実から影響を受ける唯一のビット操作です。

すべてuint32_tをに置き換え、「符号なし」値に対するintすべての操作を に置き換えると、操作の結果で同一のビット パターンが得られます。>>>>>

于 2012-07-02T14:24:32.797 に答える
1

@dasblinkenlightは彼のオペレーターなどで正しいです...

ただし、注意点が 1 つあります。Java long は 64 ビット値であるため、本当に 32 ビット相当の unsigned が必要で、64 ビット値を使用して真の 32 ビット左シフトが必要な場合、答えは次のようになります。

long myVar;

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