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

0xaaaaaaaa...等是什么?-CSDN博客icon-default.png?t=N7T8https://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;
}

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 20:40:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 20:40:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 20:40:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 20:40:02       18 阅读

热门阅读

  1. nginx 配置mp4文件播放

    2024-03-30 20:40:02       15 阅读
  2. 牛客练习赛123(A,B,C,D)

    2024-03-30 20:40:02       16 阅读
  3. 智能电销机器人的功能体现

    2024-03-30 20:40:02       18 阅读
  4. 机器学习实验------AGNES层次聚类方法

    2024-03-30 20:40:02       17 阅读
  5. react中moment方法

    2024-03-30 20:40:02       15 阅读
  6. YOLO图像前处理及格式转换

    2024-03-30 20:40:02       20 阅读
  7. 计算机OSI7层协议模型

    2024-03-30 20:40:02       16 阅读
  8. 用CSS实现单行、多行文本溢出隐藏

    2024-03-30 20:40:02       17 阅读
  9. Leetcode 674. 最长连续递增序列

    2024-03-30 20:40:02       16 阅读
  10. 搜索框中文输入导致高频触发的优化

    2024-03-30 20:40:02       17 阅读
  11. 设计模式(4):建造者模式

    2024-03-30 20:40:02       18 阅读