0xaaaaaaaa...等是什么?-CSDN博客C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。-LMLPHPhttps://blog.csdn.net/Jason_from_China/article/details/137179252

原理图解 

取出奇数位

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

取出偶数位

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

然后左移,右移把奇数位,和偶数位进行移动

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

最后奇数到偶数上面了 偶数到奇数上面了,我们只需要进行或

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

所以总的来说也就是

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

 也就是

保留奇数位,除去偶数位

保留偶数位,除去奇数位

最后

或一下,得到总的结果

代码讲解 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1))
//这里是左右缩进1 也就是原来的奇数占据偶数位置,偶数占据奇数位置
//然后再进行或因为,本质上是没有变化的,就是得出的结果,因为
//0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
//0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
//
// (num & 0xAAAAAAAA) >> 1:将选择的偶数位右移一位,这样它们就占据了奇数位的位置。
//(num & 0x55555555) << 1:将选择的奇数位左移一位,这样它们就占据了偶数位的位置
//也就是 (num & 0xAAAAAAAA) >> 1实际得到的是奇数位
//也就是(num & 0x55555555) << 1实际得到的是偶数位
//
// 但是在此之前,奇数位计算&的时候->得到的偶数位
// 00000000 00000000 00000000 10101110
// &
// 10101010 10101010 10101010 10101010
// =此时正好得出偶数位的数值
// 00000000 00000000 00000000 00101010
// 
// 但是在此之前,偶数位计算&的时候->得到的奇数位
// 00000000 00000000 00000000 10101110
// &
// 01010101 01010101 01010101 01010101
// =此时正好得出奇数位的数值
// 00000000 00000000 00000000 00000100
// 
// =最后偶数位和奇数位的数值进行|之后,得到的是整个的数值
//


void my_two(int n)//转化成二进制,对比使用函数
{
	for (int i = 31; i >= 0; i--)
	{
		int j = ((n >> i) & 1);
		printf("%d ", j);
	}
	printf("\n");
}
int main()
{
	int num = -174;
    my_two(num);
	printf("计算之前的数字=%d \n计算之后的数字=%d ", num, SWAP(num));
	return 0;
}
// 00000000 00000000 00000000 10101110
// &
// 10101010 10101010 10101010 10101010// 这个数的二进制表示中,所有的偶数位都是1,所有的奇数位都是0。
// 
// |                                 // 所以这两个或之后其实就等于哦就等于没有对结果产生影响
// 
// 00000000 00000000 00000000 10101110
// &
// 01010101 01010101 01010101 01010101//- 这个数的二进制表示中,所有的奇数位都是1,所有的偶数位都是0。
// 
// =
// 00000000 00000000 00000000 01011101//93
// 
// 
//‘10 10 11 10’, ‘01 01 11 01’, 93)
// 
// 
// 
//0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
//
//0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
//
//0x33333333 = 110011001100110011001100110011 (1和0每隔两位交替出现)
//
//0xcccccccc = 11001100110011001100110011001100(0和1每隔两位交替出现)
//
//0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出现)
//
//0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出现

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

所以主要函数也就是 C语言-写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。-LMLPHP

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1))
int main()
{
	int num = -174;
    my_two(num);
	printf("计算之前的数字=%d \n计算之后的数字=%d ", num, SWAP(num));
	return 0;
}
03-31 16:07