这是NVIDIA的一位代表在招聘会上提出的问题:
编写小而有效的代码来交换字节中的每一对位;例如,10 11 01 10
应该变成01 11 10 01
。
有没有比遍历所有其他索引的for
循环更“有效”的方法呢?我的代码很小,但我想不出这会比循环“高效”多少……我猜可能有一种方法可以使用XOR来避免循环,但我想不出来。
谢谢!
发布于 2011-01-25 08:32:43
您可以使用包含256个条目的查找表。
或者,使用((x & 0x55) << 1) | ((x & 0xAA) >> 1)
。
发布于 2011-01-25 08:33:00
像这样的东西应该是可行的
(i >> 1) & 01010101 + (i << 1) & 10101010
i >> 1
将所有内容向右移动1位,而& 01010101
仅将位保留在偶数位置。
第二部分处理相同情况下的奇数位位置。
不过,我不确定它的效率如何。
发布于 2011-01-25 23:20:20
不使用查找表(或首先生成内容),您还可以:
使用左位掩码将and向左移位AND,使用右位掩码将and移位(10101010)
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++中你可以这样做
unsigned char bitswap( unsigned char uch )
{
return ((uch<<1) & 0xAA) | (uch>>1) & 0x55 );
}
只需对从0x00到0xff的所有值运行该命令(确保循环终止!)来生成你的“表”。
https://stackoverflow.com/questions/4788799
复制相似问题