• 【宏实现二进制奇偶位交换】


    一. 二进制奇偶位交换说明意思?

    1. 就是一个int类型的整数在操作系统下是32位二进制01序列,第一位和第二位交换,第二位和第三位交换,依次类推。
    2. 交换奇偶位,需要先分别拿出奇偶位。既然是宏,分别拿出用循环不是很现实,那就用&这些位的方式来做。

    二. 解题思路

    奇数位拿出,那就是要&上010101010101……,偶数位拿出,就是要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。奇数位左移一位就到了偶数位上,偶数位右移一位就到了奇数位上,最后两个数字或起来,就完成了交换。

    举例10这个数字:

    1. 二进制序列00000000000000000000000000001010
    2. 奇位置0,将10位&上01010101010101010101010101010101
      结果:00000000000000000000000000000000
    3. 偶位置0, 将10位&上10101010101010101010101010101010
      结果:00000000000000000000000000001010
    4. 将步骤二结果左移一位:00000000000000000000000000000000
    5. 将步骤三结果右移一位:00000000000000000000000000000101
    6. 将步骤四和步骤五结果相加即使答案:
      00000000000000000000000000000101
      最终交换后结果为5

    三. 代码验证

    #include
    
    #define SWAP(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
    
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	printf("交换后%d", SWAP(n));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    四. 总结

    既然使奇偶交换,第一步先将奇数位全变0,那么就可以将偶数位全左移一位到奇数位,第二步将偶数位全变0,将奇数位全右移一位到偶数位,两结果相加就实现了奇偶交换
    最后小编制作不易,麻烦各位兄弟们,点点关注!

  • 相关阅读:
    vue拖拉拽生成表单
    JavaScript(四):遇见Promise
    class类的常用基础用法
    2.4 GHZ室内信道测量数据集
    Spring Boot 实现跨域的五种方式,总有一种适合你
    Python学习----进程和线程
    armbian 安裝配置教程
    什么是Jsoup
    Linux HTTP协议
    论文写作从 1 到 N
  • 原文地址:https://blog.csdn.net/2301_76560014/article/details/133827047