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

Han*_*Sun 4 c bit-manipulation

例如:

输入:01011111

输出:00000101

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

有没有人有任何想法?

Mar*_*ers 8

对于这种事情,我建议你去看一下奇妙的点缀黑客网页.这是该页面的解决方案之一:

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

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

b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;
Run Code Online (Sandbox Code Playgroud)

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

这种方法归功于Beeler,M.,Gosper,RW和Schroeppel,R.HAKMEM的Programming Hacks部分中的Rich Schroeppel.麻省理工学院AI备忘录239,1972年2月29日.

这是一个不使用64位整数的不同解决方案:

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

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

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