You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:15:55