我从外部输入获得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;
这是正确的,也是最佳的吗?
更新:不正确,请参阅答案。
答案 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
块代码会更清晰。编译后的操作码不会有任何不同。