0xaaaaaaaa...等是什么?-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137179252
原理图解
取出奇数位
取出偶数位
然后左移,右移把奇数位,和偶数位进行移动
最后奇数到偶数上面了 偶数到奇数上面了,我们只需要进行或
所以总的来说也就是
也就是
保留奇数位,除去偶数位
保留偶数位,除去奇数位
最后
或一下,得到总的结果
代码讲解
#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每隔四位交替出现
所以主要函数也就是
#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;
}