3

byte[]从外部输入中得到一个,其中每个字节存储两个4 位值。我的任务是从这个紧凑的数组中读取索引idx的 4 位值。我从来没有写过这样的代码,所以我想知道我下面的解决方案是否正确,如果是,那么是否有更优化的方法来做到这一点。(请让我免于“你为什么不自己测试它”的评论;测试不能证明某事的正确性,只能证明不正确......)。

所以字节和值看起来像(每个 [] 是一个byte):

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

我必须用 index 检索值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,3而不是64,3

顺便说一句,我个人认为使用else块代码会更清晰。编译后的操作码不会有任何不同。

于 2013-01-26T02:59:03.677 回答