写一个宏可以将一个数字的奇数位和偶数位交换

宏函数在C语言编程中有不可忽视的作用,并且数字二进制的奇偶位交换也比较常见,所以用宏函数来实现数字二进制的奇数位和偶数位交换不失为一个很好的方法。

首先我们要清楚宏函数的用法,其次要有用宏函数实现该功能的整体思路,下面我带着大家分析一下:

例:将数字5(0101)交换二进制奇偶位为(1010)即数字10。

就是将数字的二进制的第0位和第1位交换,第2位和第3位交换,后面以此类推。

首先我们需要将奇数位和偶数位提取出来,通过位操作运算符将两个合并成交换后的数字。

例:设需要变换的数字为x,

将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,变成偶数位为原来的奇数位,且移动后奇数位全为0;

将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,变成奇数位为原来的偶数位,且移动后偶数位全为0;

最后将两个二进制按位或((x&(0x55555555))<<1) | ((x&(0xAAAAAAAA))>>1),便最终得到了交换后的数。

注意:这里用十六进制的数值进行按位与操作十分方便,不需要将原本的十进制转换,直接位操作便可修改二进制返回之后仍为十进制!


代码如下:

#include<stdio.h>
#include<windows.h>
#define CHANGE(X) ((((X) & (0x55555555)) << 1) | (((X) & (0xAAAAAAAA)) >> 1))
int main()
{
	int x = 10;
	printf("%d\n", CHANGE(x));
	system("pause");
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值