2

7 バイト配列から最初の 49 ビットを抽出しようとしています。次のように、マスクとビットシフトを使用してこのバイトにアプローチしました。

long byteVal = ((decryptedVCW[6] & 0xff)&((decryptedVCW[6] & 0xff)<<7)) | ((decryptedVCW[5] & 0xff) << 8) | ((decryptedVCW[4] & 0xff) << 16) | ((decryptedVCW[3] & 0xff) << 24) | ((decryptedVCW[2] & 0xff) << 32) | ((decryptedVCW[1] & 0xff) << 40) | ((decryptedVCW[0] & 0xff) << 48);

ここで、decryptedVCW は 56 ビットのバイト配列です。

マスキングとビット シフトは、32 ビット シフト「<<32」まで期待どおりに機能します。

例として、decryptedVCW の 16 進数は E865037A9C6424 で、バイナリでは次のようになります。

11101000011001010000001101111010100111000110010000100100

上記のシフトを実行すると、バイナリで 7AFC6503 が得られます。

1111010111111000110010100000011

ビットシフトが32以上でバラバラになる理由と、この問題を解決する方法を知っている人はいますか?

どうもありがとうシヴ

4

1 に答える 1

5

の型はdecryptedVCW[2] & 0xffis ですint。最初のオペランドがbyteで、2 番目のオペランドがintリテラルであるためです。

<<演算子の最初のオペランドが の場合、intをシフトしているintため、2 番目のオペランドが 32 の場合、intオーバーフローが発生します。

<<演算子の最初のオペランドを次のようにキャストできますlong

(((long)(decryptedVCW[2] & 0xff)) << 32)

または、 @shmosel で提案されているように、操作でリテラルlongを使用して、最初のオペランドを強制的に a にすることができます。long&

(decryptedVCW[2] & 0xFFL) << 32
于 2016-01-12T08:27:55.423 に答える