c语言:用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

发布时间:2024年01月18日

题目

? ? ? ? ? ? ? ? ?用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

如:01,是1,交换完是10,是2.


思路

? ? ? ?1.分别取出奇数位上的数字和偶数位上的数字

? ? ? ? ? ? ? ? ? ? ? 举个例子:1001 0110? ? ? ? ? ? ? ? ? ? ? ? ? 1001 0110

? ? ? ? 奇数位上的数字是? ?1001 0110? ? ? ? ? ???偶数位? ?1001 0110? ? ??—————————————————————————————————————————? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0001 0100? ? ? ? ? ? ? ? ? ? ? ? ? ?1000 0010

取出来的新二进制数只 保留奇数位或者偶数位上原数字,其余位用0替代。

  • 我们知道,0或者1&1都等于他本身,就能保留对应位上的数字,
  • ? ? ? ? ? ? ? ? ? 1&0=0,0&0=0,就可以用&0取代不保留位置上的数字.

? ? ?2.用n&0101 0101取对应的奇数位,用n&1010 1010取对应的偶数位。

例子:? ? ? ? ? ? ? ? ? ? ? ? ?1001 0110? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1001 0110

? ? ? ? 奇数位? ? &? ? ? ? ? 0101 0101? ? ? ? ? ? ? 偶数位? ?&? ? 1010 1010? ? ? ? ? ? ? ???

——————————————————————————————————————————

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0001 0100? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1000 0010

0101就可以用0x555555表示,1010就用0xaaaaa表示。


3.将奇数位上的数字左移动1位,偶数位上的数字右移动1位,完成奇偶位交换

继续上面的例子,0001 0100<<1;1000 0010>>1.

4.用运算符|合并到一起,形成新数字(交换完成)

1|0=1;0|0=0;0|1=1。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??0010 1000

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0100 0001? |

______________________________________________________

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0110 1001


代码:

150是1001 0110

105是0110 1001

#define SWAPBIT(n) (((n)&0x55555555)<<1|((n)&0xaaaaaaaa)>>1)
#include<stdio.h>
int main()
{
	printf("%d", SWAPBIT(150));
}

效果:

文章来源:https://blog.csdn.net/2303_80025768/article/details/135660929
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。