首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以字节为单位交换每对位

以字节为单位交换每对位
EN

Stack Overflow用户
提问于 2011-01-25 08:29:07
回答 6查看 4.8K关注 0票数 9

这是NVIDIA的一位代表在招聘会上提出的问题:

编写小而有效的代码来交换字节中的每一对位;例如,10 11 01 10应该变成01 11 10 01

有没有比遍历所有其他索引的for循环更“有效”的方法呢?我的代码很小,但我想不出这会比循环“高效”多少……我猜可能有一种方法可以使用XOR来避免循环,但我想不出来。

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-25 08:32:43

您可以使用包含256个条目的查找表。

或者,使用((x & 0x55) << 1) | ((x & 0xAA) >> 1)

票数 12
EN

Stack Overflow用户

发布于 2011-01-25 08:33:00

像这样的东西应该是可行的

代码语言:javascript
运行
复制
(i >> 1) & 01010101 + (i << 1) & 10101010

i >> 1将所有内容向右移动1位,而& 01010101仅将位保留在偶数位置。

第二部分处理相同情况下的奇数位位置。

不过,我不确定它的效率如何。

票数 14
EN

Stack Overflow用户

发布于 2011-01-25 23:20:20

不使用查找表(或首先生成内容),您还可以:

使用左位掩码将and向左移位AND,使用右位掩码将and移位(10101010)

  • shift (01010101)
  • OR结果一起。

10 11 01 10

左移是01 10 11 00,用10101010掩码得到00 10 10 00

右移(原始)是01 01 10 11,用01010101掩码得到01 01 00 01

或者我们的结果一起

01 11 10 01

所以在C或C++中你可以这样做

代码语言:javascript
运行
复制
unsigned char bitswap( unsigned char uch )
{
   return ((uch<<1) & 0xAA) | (uch>>1) & 0x55 );
}

只需对从0x00到0xff的所有值运行该命令(确保循环终止!)来生成你的“表”。

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

https://stackoverflow.com/questions/4788799

复制
相关文章

相似问题

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