如何在C中翻转和反转int?

时间:2012-08-30 18:59:57

标签: c bit-manipulation

例如:

输入:01011111

输出:00000101

我知道我可以使用~翻转一个数字,但我不知道改变它的好方法。而且我不确定它们是否可以一起完成。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:8)

对于这类事情,我建议你去精彩的bit twiddling hacks网页。这是该页面的解决方案之一:

  

通过3次操作(64位乘法和模数除法)反转一个字节中的位:

unsigned char b; // reverse this (8-bit) byte

b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;
     

乘法运算创建8位字节模式的五个独立副本,以扇出为64位值。 AND操作选择相对于每个10位位组在正确(反向)位置的位。乘法和AND运算复制原始字节中的位,因此它们每个都只出现在10位集中的一个中。来自原始字节的位的反转位置与它们在任何10位组内的相对位置一致。最后一步,涉及模数除以2 ^ 10 - 1,具有将64位的每组10位(从位置0-9,10-19,20-29,...)合并在一起的效果值。它们不重叠,因此模数除法的附加步骤表现得像或操作。

     

这种方法归功于Beeler, M., Gosper, R. W., and Schroeppel, R. HAKMEM. MIT AI Memo 239, Feb. 29, 1972.

的编程黑客部分中的Rich Schroeppel

这是一个不使用64位整数的different solution

  

使用7次操作(无64位)反转一个字节中的位

     

b =((b * 0x0802LU& 0x22110LU)|(b * 0x8020LU& 0x88440LU))* 0x10101LU>> 16;

     

确保将结果赋值或转换为unsigned char以删除较高位的垃圾。由Sean Anderson于2001年7月13日设计.Typo在2002年1月3日由Mike Keith提供并更正。