我有一个任意的8位二进制数,例如11101101。
我必须交换所有的数据,比如:
交换前:交换后的11-10-11-01:11-01-11-10
我是在一次面试中被问到的!
发布于 2010-09-21 08:17:42
01010101).
10101010和10101010位),并将输入过滤成两个数字,一个是所有偶数位零,另一个是所有不均匀位零。
例如16位(非实际代码):
short swap_bit_pair(short i) {
return ((i & 0101010110101010b) >> 1) | ((i & 0x0101010101010101b) << 1));
}发布于 2010-09-21 08:15:52
b = (a & 170 >> 1) | (a & 85 << 1)发布于 2012-10-22 08:24:39
最优雅和最灵活的解决方案是,正如其他人所说的,将“梳”掩码分别应用于偶数位和奇数位,然后分别将它们左移和右移,然后使用位或位组合它们。
您可能想考虑的另一个解决方案是利用数据类型的相对较小的大小。您可以创建一个由256个值组成的查阅表,该表将静态初始化为您想要的值作为输入的输出:
const unsigned char lookup[] = { 0x02, 0x01, 0x03, 0x08, 0x0A, 0x09, 0x0B ...每个值都放在数组中,以表示索引的转换。所以如果你那么做了:
unsigned char out = lookup[ 0xAA ];out将包含0x55
这比第一种方法更麻烦、更不灵活(如果您想从8位移动到16位呢?)但确实有这样的方法:如果执行大量这些操作,它将以可测量的速度加快。
https://stackoverflow.com/questions/3758402
复制相似问题