我是位操纵的新手。 我的朋友最近在接受采访时问过我。 给定一个字节数组 例如:1000100101010101 | 001010011100 我们需要在水平位置一次翻转两位。 所以新数组应该是: 1000 | 0101等等。
等等。 我想我们从中间开始(标记为| here)并继续向外两次取两个位。 我知道如何一次反转一个数字中的单个位:
unsigned int reverse(unsigned int num)
{
unsigned int x = sizeof(num) * 8;
unsigned int reverse_num = 0, i, temp;
for (i = 0; i < x; i++)
{
temp = (num & (1 << i));
if(temp)
reverse_num |= (1 << ((x - 1) - i));
}
return reverse_num;
}
但我想知道如何才能有效地反转两位。 提前谢谢。
答案 0 :(得分:2)
我只是一次完成一个字节(或更多):
output = (input & 0x55) << 1;
output |= (input & 0xAA) >> 1;
答案 1 :(得分:0)
执行此操作的“技巧”方法是预先计算翻转位的字节表。然后,您可以使用数组中的一个字节对表进行索引,然后将其写回。正如其他人所说的那样 - 你的字节中有多少位?