用一行代码(宏)交换一个二进制整数的奇数位和偶数位

简介: 用一行代码(宏)交换一个二进制整数的奇数位和偶数位

用一行代码(宏)交换一个二进制整数的奇数位和偶数位

默认二进制数的最低为为奇数位

如果对位运算还不太熟悉,建议先看看👉传送门

·我们以一个例子来分析,例如:

对于二进制数0111 0100 1101 0101

我们交换奇偶位后就变成了:

我们发现,相较于交换前,交换后奇数位整体向左移动了一个单位,偶数位整体向右移动了一个单位

因此,我们只需要将这个数的奇数位和偶数位都提取出来,然后再分别对其进行移动,最后再合并就可以了

  • 要提取奇数位,就需要将每一个奇数位和1进行按位与操作,而数字5的二进制0101刚好符合每一个二进制位为1的特点,因此要提取奇数位,我们可以这么写:
num & 0x55555555
  • 同理,要提取偶数位,就需要一个数字的二进制偶数位都为1,而数字10的二进制1010刚好符合
num & 0xAAAAAAAA
  • 将奇数位向左移动一位,偶数位向右移动一位,最后再按位或,就可以实现交换二进制整数的奇偶位了

实现代码:

#define EXCHANGE(num) ((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1)
相关文章
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
70 0
|
6月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
6月前
|
C语言
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
|
7月前
|
C语言
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
52 0
C语言第三十二弹---打印整数二进制的奇数位和偶数位
C语言第三十二弹---打印整数二进制的奇数位和偶数位
|
7月前
打印2进制位数的奇数位和偶数位
打印2进制位数的奇数位和偶数位
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
502 0
|
C语言
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
260 0
打印整数二进制的奇数位和偶数位
打印整数二进制的奇数位和偶数位
62 0
C语音:打印整数二进制的奇数位和偶数位
总体思路: (一). 输入数据 (二). 打印奇数位: 使用 for循环 循环产生 1~32 之间的偶数, 使用 移位操作符 移动偶数位,移动后就是奇数位, 这时再 按位与1 取出当前位, 进行打印。打印完奇数后进行 换行
105 0