c语言:用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

题目

                 用一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

如:01,是1,交换完是10,是2.


思路

       1.分别取出奇数位上的数字和偶数位上的数字

                      举个例子:1001 0110                          1001 0110

        奇数位上的数字是   1001 0110             偶数位   1001 0110      —————————————————————————————————————————                                              0001 0100                           1000 0010

取出来的新二进制数只 保留奇数位或者偶数位上原数字,其余位用0替代。

  • 我们知道,0或者1&1都等于他本身,就能保留对应位上的数字,
  •                   1&0=0,0&0=0,就可以用&0取代不保留位置上的数字.

     2.用n&0101 0101取对应的奇数位,用n&1010 1010取对应的偶数位。

例子:                         1001 0110                                  1001 0110

        奇数位    &          0101 0101              偶数位   &    1010 1010                 

——————————————————————————————————————————

                                    0001 0100                                   1000 0010

0101就可以用0x555555表示,1010就用0xaaaaa表示。


3.将奇数位上的数字左移动1位,偶数位上的数字右移动1位,完成奇偶位交换

继续上面的例子,0001 0100<<1;1000 0010>>1.

4.用运算符|合并到一起,形成新数字(交换完成)

1|0=1;0|0=0;0|1=1。

                                              0010 1000

                                              0100 0001  |

______________________________________________________

                                              0110 1001


代码:

150是1001 0110

105是0110 1001

#define SWAPBIT(n) (((n)&0x55555555)<<1|((n)&0xaaaaaaaa)>>1)
#include<stdio.h>
int main()
{
	printf("%d", SWAPBIT(150));
}

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝lanll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值