从字节数组中读取4位块

时间:2013-01-26 02:50:30

标签: java android

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

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

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

我必须使用索引idx检索该值。显然:

  • 如果我是偶数,则表达式为:array[idx/2] & 0xF0
  • 如果我是奇数,则表达式为:array[idx/2] & 0x0F

所以代码是:

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

这是正确的,也是最佳的吗?


“快速”读者

更新:不正确,请参阅答案。

1 个答案:

答案 0 :(得分: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块代码会更清晰。编译后的操作码不会有任何不同。