例如:
输入:01011111
输出:00000101
我知道我可以使用~
翻转一个数字,但我不知道改变它的好方法。而且我不确定它们是否可以一起完成。
有没有人有任何想法?
答案 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提供并更正。