【漫步刷题路】-交换二进制的奇数位和偶数位

简介: 交换二进制的奇数位和偶数位

题目要求

使用宏交换二进制的奇数位和偶数位


必备知识

66e9e2401b33431384bc4c5ed0a3b19e.png

注意

  • 如果想要保留一个比特位,将其它位舍弃

方法:给要保留的比特位与上1,其它位与上0

如:
1000 0011
现在只想保留最高位的1
->只需与上:1000 0000
    1000 0011
   &1000 0000
   -----------
    1000 0000  这样就实现了保留最高位的1,其它舍弃的效果
  • 如果想要某一个位变成1,其它位不变

方法:给该位或上1,其他位或上0

如:
1000 0011
现在只想保留最高位的1
->只需与上:1000 0000
    1000 0011
   &1000 0000
   -----------
    1000 0000  
    这样就实现了保留最高位的1,其它舍弃的效果

思路分析1

a776774c3bc64599ba7da56b581795b4.png

代码1

#include<stdio.h>
#define SWAP(n)  n = ((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1)
int main()
{
  int a = 10;
  //0000 1010
  //奇偶交换结果:0000 0101 ->5
  int b = 20;
  //0001 0100
  //奇偶交换结果:0010 1000 ->40
  printf("%d\n", SWAP(a));
  printf("%d\n", SWAP(b));
  return 0;
}

思路分析2

ff62198067b94cdf9d37267a8bc73a19.png

代码2

#include<stdio.h>
#define SWAP(n)  n = ((n&0x55555555)<<1) ^ ((n&0xaaaaaaaa)>>1)
int main()
{
  int a = 10;
  //0000 1010
  //奇偶交换结果:0000 0101 ->5
  int b = 20;
  //0001 0100
  //奇偶交换结果:0010 1000 ->40
  printf("%d\n", SWAP(a));
  printf("%d\n", SWAP(b));
  return 0;
}
相关文章
|
6月前
|
Java
链表中奇数位和偶数位的置换
链表中奇数位和偶数位的置换
|
25天前
|
Java 开发者
【编程基础知识】2的n次幂与二进制位全为1之间的联系,为啥只差一个1
本文深入探讨了2的n次幂与二进制位全为1之间的数学联系,解释了2的n次幂减一的二进制表示为何全为1,并探讨了这一特性在HashMap中的应用。通过基础数学原理和实际代码示例,文章揭示了这一特性的实用价值,适合各水平的编程爱好者学习。
17 3
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
61 0
|
5月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
6月前
62.编程求所有的三位素数,且要求该数是对称数
62.编程求所有的三位素数,且要求该数是对称数
40 0
|
6月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
|
11月前
|
C语言
C语言第三十二弹---打印整数二进制的奇数位和偶数位
C语言第三十二弹---打印整数二进制的奇数位和偶数位
|
6月前
打印2进制位数的奇数位和偶数位
打印2进制位数的奇数位和偶数位
C语音:打印整数二进制的奇数位和偶数位
总体思路: (一). 输入数据 (二). 打印奇数位: 使用 for循环 循环产生 1~32 之间的偶数, 使用 移位操作符 移动偶数位,移动后就是奇数位, 这时再 按位与1 取出当前位, 进行打印。打印完奇数后进行 换行
100 0
打印整数二进制的奇数位和偶数位
打印整数二进制的奇数位和偶数位
53 0