【发布时间】:2009-09-26 22:09:17
【问题描述】:
我有一个 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 的优化
【问题讨论】:
-
我真的很喜欢你的做法。位移非常快。
标签: algorithm language-agnostic boolean bits shift