1.4 将整数的二进制奇偶位互换

Chapter1: 位运算的奇技淫巧

4. 将整数的二进制奇偶位互换

问题

将整数的二进制奇偶位互换

算法

算法1: 用 & 运算分别取出奇偶位的数再交错异或(或用| 运算)
  1. 使用位运算 & 分别取出该整数 N 二进制的奇数和偶数位,

  2. 将得到奇数位的数向右移一位得到数字 a,将得到的偶数位向左移一位得到数字 b

  3. a^b (a|b也可)就是答案

int swap1(int num){
    
    //分别提取奇数位和偶数位 
    int even = num&0xaaaaaaaa;//0xaaaaaaaa=1010...1010(二进制1010 x8)
    int odd = num&0x55555555;//0x55555555=0101...0101(二进制0101 x8)
    
    //移位合并
    int newEven = odd<<1;//这样移动才不会丢失有效数字(只是丢失0) 
    int newOdd = even>>1; 
    
    int result = newEven^newOdd;//与有效位相^的都是0,所以等价于 newEven|newOdd 
    return result;
}
算法2:交替存储到数组再转为数字输出

可参考 [3] 用字符数组的解法 ,这是用java 实现的

用C++实现的话(太麻烦了)

  • 将数值转为二进制字符串(string类型)[1]

  • 在循环里调换相邻奇偶位的字符(string类型也可以直接用下标索引的方式操作)[5]

  • string 类型转 char[] 类型

  • 将字符串输出为十进制数字( string 直接转无有效方法[2],网上给的方案都是针对char[]类型的转换[3],string类型需要先转为char[]类型[3] [4],但是将char[]转为数字时又遇到32位数字太长无法存储保证精度的问题,要将其转为十进制输出)

int swap2(int num){
    
    /*将num转为二进制数字*/
    
    //sizeof(type) 返回type类型占多少字节 
    bitset<sizeof(int)*8> binaryNum(num); //#include <bitset> 
    //bitset<32> t(num);//32为输出的位数,可以随意设置,不是2的倍数也行 
    
    /*数字转字符串*/ 
    string binaryStr = binaryNum.to_string();   
    //printf("A%cA",binaryStr[31]);
    
    /*奇偶位互换*/
    for(int i=0;i<binaryStr.length();i+=2){
        char tmp = binaryStr[i];
        binaryStr[i] = binaryStr[i+1];
        binaryStr[i+1]=tmp;
    } 
    /*string 转char* */ 
    const char* str=binaryStr.c_str();
    
    long newNum;
    
    /*char[] 转int,这样会丢失精度,32位数字太长了long也无法存储 */ 
    sscanf( str, "%ld", &newNum );  
    printf("%ld\n",newNum);
    
    //todo:想办法直接将char[]转为数字后直接转为十进制的形式输出 

    return 0;
} 

参考资料

[1] C++将一个数值转化为二进制字符串

[2] c++下使用CString将字符串转二进制、八进制、十进制、十六进制( afx.h 头文件找不到)

[3] C++ C int数字与string字符串的转换; string与char*转换 (string与cstring转换)

[4] C++ 把string 转换为char型数组

[5] 用字符数组的解法

[6] 用位运算的解法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值