javascript - 去交错字节

标签 javascript bit-manipulation bitwise-operators

给定一个交错的位序列:

ABABABABABABABAB

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

AAAAAAAABBBBBBBB

最佳答案

这被称为 unshuffle (另请参阅 Hacker's Delight 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 位数字,您可以切掉每个掩码的左半部分并跳过最后一步。

这是一个增量交换序列,请参阅计算机编程艺术第 4A 卷,按位技巧和技术,位交换。

关于javascript - 去交错字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984671/

相关文章:

java - 测试无效位标志

language-agnostic - n 位整数中有多少个 1?

java - 当字节数为奇数时,如何从 ByteBuffer(Little Endian)中获取 long?

javascript - 检查是否检查了所有输入

javascript - 通过函数动态选择运行哪个数组

javascript - Shopify 布鲁克林主题 : changes not reflected

javascript - 如何为html元素分配本地存储值?

C:对可变长度位串的位操作

java - 使用按位运算符检查 JAVA 中的梅森数

c++ - 为什么某些情况需要使用 'bitwise' 运算符而不是 'logical'/'equality' 运算符?