给出隔行扫描的比特序列:
ABABABABABABABAB
我可以使用什么javascript按位操作将其转换为序列:
AAAAAAAABBBBBBBB
答案 0 :(得分:1)
如果它对您有好处,请查看此算法:
function deinterlace(input) {
var maskOdd = 1;
var maskEven = 2;
var result = 0;
for (var i = 0; i < 8; i++) {
result = result << 1;
if(maskOdd & input) {
result += 1;
}
maskOdd = maskOdd << 2;
}
for (var j = 0; j < 8; j++) {
result = result << 1;
if(maskEven & input) {
result += 1;
console.log(result);
}
}
return result;
}
工作fiddle。
答案 1 :(得分:1)
这被称为unshuffle(另见Hacker&#39;喜悦7.2,改组位)。
Hacker's Delight中给出的算法是:
t = (x ^ (x >> 1)) & 0x22222222; x = x ^ t ^ (t << 1);
t = (x ^ (x >> 2)) & 0x0C0C0C0C; x = x ^ t ^ (t << 2);
t = (x ^ (x >> 4)) & 0x00F000F0; x = x ^ t ^ (t << 4);
t = (x ^ (x >> 8)) & 0x0000FF00; x = x ^ t ^ (t << 8);
这些右移可以是逻辑或算术,带掩码的AND确保受该差异影响的位不会出现在t
中。
这是32位数字,对于16位数字,你可以砍掉每个掩码的左半部分并跳过最后一步。
这是一系列delta交换,参见计算机编程艺术第4A卷,Bitwise技巧和技巧,bitwapping。