首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交换字节中的一对位

交换字节中的一对位
EN

Stack Overflow用户
提问于 2010-09-21 08:10:20
回答 5查看 12.6K关注 0票数 10

我有一个任意的8位二进制数,例如11101101

我必须交换所有的数据,比如:

交换前:交换后的11-10-11-0111-01-11-10

我是在一次面试中被问到的!

EN

回答 5

Stack Overflow用户

发布于 2010-09-21 08:17:42

01010101).

  • Use

  • 制作了两位掩码,一个包含所有偶数位,另一个包含不均匀位(1010101010101010位),并将输入过滤成两个数字,一个是所有偶数位零,另一个是所有不均匀位零。

  • 将只包含一个偶数位的数字移到左边,另一个位移到右端

  • 使用位数,或者将它们组合在一起。

例如16位(非实际代码):

代码语言:javascript
复制
short swap_bit_pair(short i) {
    return ((i & 0101010110101010b) >> 1) | ((i & 0x0101010101010101b) << 1));
}
票数 6
EN

Stack Overflow用户

发布于 2010-09-21 08:15:52

代码语言:javascript
复制
b = (a & 170 >> 1) | (a & 85 << 1)
票数 0
EN

Stack Overflow用户

发布于 2012-10-22 08:24:39

最优雅和最灵活的解决方案是,正如其他人所说的,将“梳”掩码分别应用于偶数位和奇数位,然后分别将它们左移和右移,然后使用位或位组合它们。

您可能想考虑的另一个解决方案是利用数据类型的相对较小的大小。您可以创建一个由256个值组成的查阅表,该表将静态初始化为您想要的值作为输入的输出:

代码语言:javascript
复制
const unsigned char lookup[] = { 0x02, 0x01, 0x03, 0x08, 0x0A, 0x09, 0x0B ...

每个值都放在数组中,以表示索引的转换。所以如果你那么做了:

代码语言:javascript
复制
unsigned char out = lookup[ 0xAA ];

out将包含0x55

这比第一种方法更麻烦、更不灵活(如果您想从8位移动到16位呢?)但确实有这样的方法:如果执行大量这些操作,它将以可测量的速度加快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3758402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档