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