如何在C语言中对int类型执行位操作以交换相邻nibble?
C语言中用位操作交换int的相邻半字节(Nibble)
要实现交换int类型中每个字节内的相邻半字节(4位),可以通过掩码提取、位移和按位或操作完成,以下是具体实现:
核心思路
每个字节由两个半字节组成(高4位和低4位),我们需要:
- 提取每个字节的高4位,右移4位到低4位的位置
- 提取每个字节的低4位,左移4位到高4位的位置
- 将两部分结果按位合并,得到交换后的数值
代码实现
#include <stdio.h> int swap_adjacent_nibbles(int x) { // 提取高4位并右移,提取低4位并左移,最后按位或合并 return ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4); } int main() { int input = 0xDEAD; int output = swap_adjacent_nibbles(input); printf("输入: 0x%X\n输出: 0x%X\n", input, output); return 0; }
代码解释
- 掩码
0xF0F0F0F0:二进制为11110000 11110000 11110000 11110000,用于保留每个字节的高4位,丢弃低4位。右移4位后,这些高4位会移动到对应字节的低4位位置。 - 掩码
0x0F0F0F0F:二进制为00001111 00001111 00001111 00001111,用于保留每个字节的低4位,丢弃高4位。左移4位后,这些低4位会移动到对应字节的高4位位置。 - 按位或操作:将上述两部分结果合并,每个字节内的高低半字节完成交换,最终得到整体结果。
验证示例
输入0xDEAD(二进制:1101 1110 1010 1101):
- 高4位提取右移后:
0000 1101 0000 1010(0x0D0A) - 低4位提取左移后:
1110 0000 1101 0000(0xE0D0) - 按位或结果:
1110 1101 1101 1010(0xEDDA),与预期输出一致。
内容的提问来源于stack exchange,提问作者User_008
相关产品推荐
相关产品推荐

