从字节数组中读取4位二进制块

4
我将从外部输入获取一个byte[],其中每个字节存储两个4位值。我的任务是从这个紧密打包的数组中读取索引idx的4位值。我从未编写过这样的代码,所以我想知道我的以下解决方案是否正确,如果是,是否有更优化的方法来完成它。(请不要让我听到“为什么不自己测试”的评论;测试无法证明某些东西的正确性,只能证明错误...)。
因此,字节和值看起来像这样(每个[]都是一个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;

这是正确且最优的吗?


更新针对“快速”阅读者:这不是正确的,请参见答案。

1个回答

4

您的想法应该是正确的,但我认为您可能需要更改代码以使用位移:

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

因为如果你有01000011,你可能想要得到4,3而不是64,3

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


哎呀,你在位移操作上是对的,我没注意到。谢谢。 - Thomas Calc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接