3

byte[]外部入力からを取得しています。各バイトには2つの4ビット値が格納されています。私の仕事は、この密集した配列からインデックスidxの4ビット値を読み取ることです。私はそのようなコードを書いたことがないので、以下の解決策が正しいかどうか、そして正しい場合は、それを行うためのより最適な方法があるかどうか疑問に思います。(「自分でテストしてみませんか」というコメントは避けてください。テストでは、何かの正しさを証明することはできず、不正確さだけを証明することができます...)。

したがって、バイトと値は次のようになります(各[]は1つですbyte):

[value0|value1] [value2|value3] [value4|value5] [value6|value7]

そして、インデックスを使用して値を取得する必要がありますidx。明らかに:

  • iが偶数の場合、式は次のようになります。array[idx/2] & 0xF0
  • iが奇数の場合、式は次のようになります。array[idx/2] & 0x0F

したがって、コードは次のとおりです。

if (idx % 2 == 0) {
   return array[idx/2] & 0xF0;
}
return array[idx/2] & 0x0F;

これは正しく、最適ですか?


「クイック」リーダーの更新:正しくありません。回答を参照してください。

4

1 に答える 1

3

あなたの考えは正しいはずですが、ビットシフトを使用するようにコードを変更することをお勧めします。

if (idx % 2 == 0) {
   return array[idx/2] >>> 4; // unsigned bit shift
}else{
    return array[idx/2] & 0x0F;
}

持っている場合は、の代わりに01000011取得することをお勧めします。4,364,3

ちなみに、個人的にはelseブロックを使えばコードがわかりやすくなると思います。コンパイルされたオペコードに違いはありません。

于 2013-01-26T02:59:03.677 に答える