去隔行字节

时间:2014-04-10 09:58:24

标签: javascript bit-manipulation bitwise-operators

给出隔行扫描的比特序列:

ABABABABABABABAB

我可以使用什么javascript按位操作将其转换为序列:

AAAAAAAABBBBBBBB

2 个答案:

答案 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。