Han*_*Sun 4 c bit-manipulation
例如:
输入:01011111
输出:00000101
我知道我可以使用~翻转数字,但我不知道逆转它的好方法.而且我不确定他们是否可以一起完成.
有没有人有任何想法?
对于这种事情,我建议你去看一下奇妙的点缀黑客网页.这是该页面的解决方案之一:
使用3个操作(64位乘法和模数除法)反转一个字节中的位:
Run Code Online (Sandbox Code Playgroud)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,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提供并修正.