【C/C++算法练习题】1、交换一个数二进制的奇偶位

27 篇文章 1 订阅

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

1、要交换奇数位和偶数位,只需要将奇数位全部提取出来向左移动一位
2、要交换偶数位和奇数位,只需要将偶数位全部提取出来向右移动一位
3、再将上述两步的结果合并

1、如何提取奇数位

奇数位一般在第1、3、5 … 29、31上
设计一个序列在这几个位上为1,其他位上为0,然后相与,可得出原始的奇数位上的数字,而偶数位上都是0
如10的二进制为
10: 00000000 00000000 00000000 00001010
提取器:01010101 01010101 01010101 01010101
得到: 0000000 0000000 0000000 0000000

2、如何提取偶数位

10: 00000000 00000000 00000000 00001010
提取器:10101010 10101010 10101010 10101010
得到: 0000000 00000000 00000000 00001010

偶数得到的向右一位,奇数得到的向左一位

奇数左移1位:00000000 00000000 00000000 00000000
偶数右移1位:00000000 00000000 00000000 00000101
相或(加)得:0000000 00000000 00000000 00000101
十六进制: 00 00 00 05

#include "stdio.h"

//01010101 01010101 01010101 01010101  55 55 55 55
//00000000 00000000 00000000 00001010  00 00 00 0a
//10101010 10101010 10101010 10101010  aa aa aa aa

#define EXC(n) ((n & 0xaaaaaaaa)>>1) | ((n & 0x55555555)<<1)

int main(){
    int n = 10;
    int ret = EXC(n);
    printf("%p ", ret);
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值