【C语言】写一个宏实现将一个整数的二进制的奇数位和偶数位交换

简介: 【C语言】写一个宏实现将一个整数的二进制的奇数位和偶数位交换

大家好,欢迎来阅读子豪的文章,大家有什么宝贵的意见或建议可以在留言区留言

如果你喜欢我的文章,欢迎 素质三连 点赞 关注 收藏

我的码云仓库:补集王子 (YZH_skr) - Gitee.com

不要偷偷拿走我的小火车哦~嘿嘿


2fe89ace982b4277bec13865e23aed47.gif


今天我们来写一个宏:将一个整数的二进制的奇数位和偶数位交换


1. 取出奇数或者偶数    按位与 0101010类似的数据


0x 5 5 5 5 5 5 5 5    按位与 这个 就保留了 奇数        5 —> 0101


将&之后的数据 向左移动一位 就将奇数位的数据放到了偶数位


2.移位


(num&0x55555555)<<1    奇数位去偶位置


同样的方式我们可以得到偶数然后向右移动一位 奇数位就去了偶数位的位置


(num&0xaaaaaaaa)>>1    偶数位去奇位置


3.合成


之后我们把这两个操作完后的数据一加 就得到了我们想要的数据


num = ((num&0x55555555)<<1)+((num&0xaaaaaaaa)>>1)


4.宏的实现


将以上方法用宏来实现


#include <stdio.h>
#define SWAP(num) (num = ((num&0x55555555)<<1)+((num&0xaaaaaaaa)>>1))
int main()
{
    int num = 10;            //00000000000000000000000000001010    10
    SWAP(num);
    printf("%d", num);    //00000000000000000000000000000101    5
    return 0;        
}


5.总结


1.思考这类二进制的操作问题肯定第一反应是想到 与 或 异或 移位 之类的操作符


2.结合二进制本身性质,加上一些数学思维就能解题


3.利用宏的性质【替换】来实现函数的性质


本节内容 完

相关文章
|
3月前
|
编译器 程序员 C语言
C语言 宏
C语言 宏
41 5
|
4月前
|
Linux C语言
C语言宏IS_REACHABLE
C语言宏IS_REACHABLE
44 1
|
5月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
5月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
5月前
|
安全 编译器 C语言
【C语言进阶篇】offsetof宏的介绍 及其实现
【C语言进阶篇】offsetof宏的介绍 及其实现
|
5月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
C语言
《C语言及程序设计》实践参考——分离整数和小数部分
返回:贺老师课程教学链接  C语言及程序设计初步  项目要求 要求:编写一个程序,其功能为:从键盘上输入一个浮点数(小数点后有三位数),然后分别输出该数的整数部分和小数部分。样例输入:123.456样例输出:123 456 [参考解答] #include &lt;stdio.h&gt; int main() { float x; int a, b; scanf("%
1955 0
|
14天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
30 6
|
1月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
40 10