2

Java の場合:

32 ビットの数値が 16 進数形式で与えられています。特定のバイト番号 (最下位バイトは 0 から 3、0) が与えられ、そのバイトを 16 進数形式で与えられた別のバイトに置き換える必要があると言われました。例: 32 ビットの数値 0xAAA5BBC6、バイト 1 を 0x17 に置き換えて 0xAAA517C6 を取得します。

キャスト、乗算、加算、減算、または条件を使用できません。ヘルパー メソッドを記述したり、このファイルまたは別のファイルから他のメソッドを呼び出してメソッドを実装したりすることはできません。さらに、これは 1 行のコードで記述する必要があります。

マスキングを使用する必要があると思いますが、どこから始めればよいかわかりません。バイト番号が与えられた場合、どうすれば 8 ビットすべてを変更できますか。1 つをオフまたはオンに切り替えるのは簡単ですが、8 ビットすべてを特定の値に切り替えるにはどうすればよいでしょうか。

4

2 に答える 2

1

次の例を見てください。

input   =    AA      A5         BB      C6  (in hex)
input   = 10101010 10100101 10111011 11000110 (in binary)
mask    =    FF       FF       00       FF  (in hex)
mask    = 11111111 11111111 00000000 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00000000 11000110 (bitwise AND)
replace =    FF       FF       17       FF  (in hex)
replace = 11111111 11111111 00010111 11111111 (in binary) 
-------------------------------------------------------
input   = 10101010 10100101 00010111 11000110 (bitwise OR)
input   =    AA      A5         17      C6  (in hex)

最後の行は、目的の出力です。ご覧のとおり、AND と ORの 2 つのビット演算があります。どのように機能するかを知るには、それらをたくさん勉強する必要があります。

于 2015-09-02T04:00:27.587 に答える
0

バイトが最下位バイトからカウントされていると仮定すると、1 行で次のようになります。

int updatedValue = originalValue & ~(0xFF << (byteNumber << 3)) | ((((int)newByte) & 0xFF) << (byteNumber << 3));

ここで:
originalValue元の 32 ビット整数
newByteは、古いバイトを置き換えるために与えられたバイト
byteNumberです。バイト番号 (0-3) です。

コードが行うことは次のとおりです。

  • 古いバイトを「削除」するためのマスクを作成します (このバイトのビットをクリアします)。マスクを作成するには:

    • すべてのビット セットのバイトのマスクを作成する (オールインワン)0xFF
    • このマスクを「削除」するバイトの位置にオフセットします。「削除」するバイトの数の 8 倍にする必要があります。乗算できないため (制限の一部)、この数値を 3 ビット左にオフセットします (これは 8 を乗算するのと同じです。ビットを 1 桁左に移動することは 2 を乗算するのと同じであることを覚えておいてください。 3 のオフセットは 2 * 2 * 2 = 8 になります) これは、次のコードによって行われます。(byteNumber << 3)
    • でマスクのビットを「トグル」する~ので、バイトを「削除」する~(0xFF << (byteNumber << 3))マスクがあります。この時点で、FFFF00FFバイト #1 をクリアしたい場合は、次のようにマスクします。
  • 元の数値と最初のステップで作成されたマスクの間でビットごとの操作を実行します。~(0xFF << (byteNumber << 3))

  • 新しいバイトで 32 ビット整数を作成し、そのビットをバイトの位置にオフセットします。(byteNumber << 3)ここでも、すでに説明したオフセットが行われます。
  • 2 番目のステップの結果を使用して or ビット単位の操作を実行し、新しいバイトのビットを設定します (これはコード行であり、最後のステップです)。

今、私が justまたは just((int)newByte) & 0xFF)の代わりに行っている理由は、JVM がoperation を実行する前に operatorにプロモートするためです。 newByte が 0x7F よりも大きい場合、これは望ましくない影響を与える可能性があります (たとえば、の値はの代わりにasにキャストします)。そうすることで、自分でプロモーションを行い、念のために不要なビットをクリアします。((int)newByte))newByteintbyte<<0x80int0xFFFFFF800x00000080((int)newByte) & 0xFF)int

于 2015-09-02T04:08:27.243 に答える