[牛人杂谈] C语言的位域反转操作,你用过吗?

[复制链接]
1007|3
 楼主| wahahaheihei 发表于 2024-2-27 15:53 | 显示全部楼层 |阅读模式
  1. unsigned int reverse_bits(unsigned int num) {
  2.     unsigned int numOfBits = sizeof(num) * 8;
  3.     unsigned int reverseNum = 0;

  4.     for (unsigned int i = 0; i < numOfBits; i++) {
  5.         if (num & (1 << i)) {
  6.             reverseNum |= (1 << ((numOfBits - 1) - i));
  7.         }
  8.     }
  9.     return reverseNum;
  10. }
该函数将给定的无符号整数的位进行反转,可以用于某些嵌入式系统中的位级操作需求。
 楼主| wahahaheihei 发表于 2024-2-27 15:53 | 显示全部楼层
在 C 语言中,位域反转是指将一个整数的二进制表示中的位逆序排列。这意味着最高位变成最低位,次高位变成次低位,以此类推。实现位域反转的方法通常涉及位运算和循环。
以下是一个实现位域反转的简单示例:
  1. #include <stdio.h>

  2. // 函数用于反转一个字节(8位)的位
  3. unsigned char reverseBits(unsigned char num) {
  4.     unsigned char reversed = 0; // 用于存储反转后的结果
  5.     int i;

  6.     for (i = 0; i < 8; i++) {
  7.         reversed = (reversed << 1) | (num & 1); // 将 num 的最低位加到 reversed 的最低位
  8.         num >>= 1; // 将 num 右移一位,为下一位的处理做准备
  9.     }

  10.     return reversed;
  11. }

  12. int main() {
  13.     unsigned char num = 0b10101010; // 示例输入:10101010
  14.     unsigned char reversed = reverseBits(num);
  15.     printf("Original: 0x%X\n", num);
  16.     printf("Reversed: 0x%X\n", reversed);

  17.     return 0;
  18. }
 楼主| wahahaheihei 发表于 2024-2-27 15:53 | 显示全部楼层
上面这个示例中,reverseBits() 函数接受一个 8 位的无符号整数作为输入,通过循环,将输入的每一位从最低位开始提取出来,并按照逆序的顺序存储到结果变量 reversed 中。在每一次迭代中,使用了位操作符 << 和 | 来将每一位加入到 reversed 中。

在主函数中,我们定义了一个 8 位的二进制数字作为示例输入,并调用 reverseBits() 函数进行反转。最后,打印原始数字和反转后的数字的十六进制表示。
dongnanxibei 发表于 2024-2-28 19:56 | 显示全部楼层
位操作在嵌入式应用中很常见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

234

主题

3227

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部