我有一个 16 位的值,它的位是“交错的”。
我想得到一个包含 8 个项目(值 0 到 3)的数组,它按以下顺序存储位:
- 第 0 项:第 7 位和第 15 位
- 第 1 项:第 6 位和第 14 位
- 第 2 项:第 5 位和第 13 位
- ...
- 第 7 项:位 0 和 8
这是一个简单的解决方案:
function uninterlace(n) {
return [((n>>7)&1)|((n>>14)&2), // bits 7 and 15
((n>>6)&1)|((n>>13)&2), // bits 6 and 14
((n>>5)&1)|((n>>12)&2), // bits 5 and 13
((n>>4)&1)|((n>>11)&2), // bits 4 and 12
((n>>3)&1)|((n>>10)&2), // bits 3 and 11
((n>>2)&1)|((n>> 9)&2), // bits 2 and 10
((n>>1)&1)|((n>> 8)&2), // bits 1 and 9
((n>>0)&1)|((n>> 7)&2)];// bits 0 and 8
}
有谁知道这样做更好(更快)的方法?
编辑:
笔记:
- 构建预先计算的表不是一种选择。
- 无法使用汇编程序或特定于 CPU 的优化