大家好,欢迎来阅读子豪的文章,大家有什么宝贵的意见或建议可以在留言区留言
如果你喜欢我的文章,欢迎 素质三连 点赞 关注 收藏
我的码云仓库:补集王子 (YZH_skr) - Gitee.com
不要偷偷拿走我的小火车哦~嘿嘿
今天我们来写一个宏:将一个整数的二进制的奇数位和偶数位交换
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.利用宏的性质【替换】来实现函数的性质
本节内容 完