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

欢迎各位老铁们,观看我写的博客!

用C语言写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换_第1张图片

一:什么是宏
二:将一个整数的二进制位的奇数位和偶数位交换的解析
      1.整数化为二进制
       2.取出奇数位和偶数位
       3. 奇数位左移
        4.偶数位右移     
        5.交换

一:#define 可以用来定义宏

宏的声明方式:

#define name(parament list) stuff

parament list:表示参数列表

stuff:表示把参数替换后的内容

二: 将一个整数的二进制位的奇数位和偶数位交换的解析

比如说把10对应2进制位的奇数位和偶数位交换

2.1)  10对应的2进制位   00000000 00000000 00000000 00001101

2.2)接下来我们需要考虑要如何拿到对应的奇数位?偶数位?

用C语言写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换_第2张图片

我们不妨这样设想一下:对这个数00000000 00000000 00000000 00001101上 01010101 01010101 01010101 01010101(对应16进制:0x55 55 55 55)

  00000000 00000000 00000000 00001101

&

 01010101 01010101 01010101 01010101

这样我们就可以拿到对应的奇数位:0000 0000 0000 0011

00000000 00000000 00000000 00001101

10101010 10101010 10101010 10101010(对应16进制:0xaa aa aa aa)

就拿到对应的偶数位:0000 0000 0000 0010

2.3)奇数位左移

0000 0000 0000 0011 <<1

2.4)偶数位右移

0000 0000 0000 0010 >>1

2.5)

(0000 0000 0000 0011 <<1) | (0000 0000 0000 0010 >>1) 就可以达到效果:

00000000 00000000 00000000 00001110(10进制:14)

草图如下:

 
  

ok~~~经过以上分析,咱上代码

用C语言写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换_第3张图片

#define _CRT_SECURE_NO_WARNINGS 1
#include
#define SWAP(n)  (((n&0xaaaaaaaa)>>1) | ((n&0x55555555)<<1))


int main()
{
	int n = 13;
	int m = SWAP(n); //  交换之后
	printf("%d\n", m);


}

你可能感兴趣的:(c语言,开发语言)