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

C语言位掩码实操:如何从16位无符号短整型提取前7位?

提取unsigned short前7位的正确实现

问题分析

你要处理的是16位无符号整数,前7位是最高位(位15)到位9,对应你给的例子0x3f23(二进制0011111100100011),提取后应该得到十进制31。你说右移9位没得到正确结果,大概率是代码里的类型错误、掩码误用或者变量初始化问题。

正确代码实现

直接右移9位就能得到结果(无符号类型右移是逻辑右移,高位补0,不会出错):

#include <stdio.h>

int main() {
    unsigned short num = 0x3f23;
    // 右移9位,把前7位移到低位
    unsigned int result = num >> 9;
    printf("%u\n", result); // 输出31
    return 0;
}

如果要更清晰地体现位掩码的用法,也可以先掩码清零无关位,再右移:

#include <stdio.h>

int main() {
    unsigned short num = 0x3f23;
    // 掩码0xFE00对应二进制1111111000000000,只保留前7位
    unsigned int masked = num & 0xFE00;
    // 右移9位把目标位移到低位
    unsigned int result = masked >> 9;
    printf("%u\n", result); // 输出31
    return 0;
}

常见错误原因

  1. 用了有符号short类型:如果是signed short,当数值超过0x7FFF(即最高位为1)时,右移会触发算术右移(高位补符号位1),导致结果错误。必须用unsigned short保证逻辑右移。
  2. 掩码写错:比如误用0x7F(低7位掩码),会提取最后7位而不是前7位。
  3. 右移位数错误:比如右移8位,会得到0x3f(十进制63),这是前8位的结果,不是前7位。
  4. 变量未初始化:如果num没赋值,会是随机垃圾值,结果自然随机。

位掩码核心逻辑

  • 提取某几位:先做按位与(&)用掩码保留目标位,再右移把目标位移到低位。
  • 掩码规则:要保留的位设为1,其余设为0。比如前7位的掩码是0xFE00(二进制前7位为1),或者用((1 << 7) - 1) << 9动态生成(更通用,适合不同位数的提取)。

内容的提问来源于stack exchange,提问作者ZSR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:45:33