uint16_t类型数值391的位反转实现问题求助
解决uint16_t整数位翻转问题
你用x = 391 << sizeof(uint16_t)完全找错了方向——sizeof(uint16_t)返回的是字节数2,左移2位只是把数值乘以4,和位翻转没有关系,这就是你得到1564的原因。
下面给你几种可行的位翻转实现方式:
方法一:逐位手动翻转
针对16位整数,循环处理每一位,把原数的最低位依次转移到结果的最高位:
#include <stdint.h> uint16_t reverse_bits(uint16_t x) { uint16_t result = 0; for (int i = 0; i < 16; i++) { result <<= 1; // 结果左移一位,腾出最低位空间 result |= x & 1; // 取原数最低位,放到结果的最低位 x >>= 1; // 原数右移一位,处理下一位 } return result; } // 使用示例 uint16_t x = 391; x = reverse_bits(x); // 得到目标值57728
方法二:查表法(高性能场景)
如果需要频繁进行16位位翻转操作,可以预先计算好所有65536种可能的结果,存在数组里,后续直接查表返回,速度最快:
#include <stdint.h> uint16_t reverse_table[65536]; // 程序启动时初始化一次表 void init_reverse_table() { for (uint16_t i = 0; i < 65536; i++) { uint16_t val = 0; uint16_t temp = i; for (int j = 0; j < 16; j++) { val <<= 1; val |= temp & 1; temp >>= 1; } reverse_table[i] = val; } } // 使用时直接查表 uint16_t x = 391; x = reverse_table[x]; // 直接得到57728
方法三:分治位运算(无循环)
利用分治法,逐步交换相邻位、两位组、四位组、八位组,最终完成16位整体翻转:
#include <stdint.h> uint16_t reverse_bits(uint16_t x) { // 交换相邻单个位 x = ((x >> 1) & 0x5555) | ((x & 0x5555) << 1); // 交换相邻两位组成的组 x = ((x >> 2) & 0x3333) | ((x & 0x3333) << 2); // 交换相邻四位组成的组 x = ((x >> 4) & 0x0F0F) | ((x & 0x0F0F) << 4); // 交换高低八位 x = ((x >> 8) & 0x00FF) | ((x & 0x00FF) << 8); return x; }
验证说明:391的二进制是0000000110000111,翻转后得到1110000110000000,转换成十进制正好是57728,符合你的期望。
内容的提问来源于stack exchange,提问作者Calvince
相关产品推荐
相关产品推荐

