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

仅使用位运算符在C++中实现移位二进制值的符号扩展

解决方案

核心思路是利用有符号整数算术右移的自动符号扩展特性,替代原代码里的乘法操作,全程只用位运算符,不用条件、循环或者乘法。

优化后的代码

int signedBits5through8(int v){
    // 精准提取第5到8位(共4位,从0开始计数)
    int fourBits = (v & 0b111100000) >> 5;
    // 自动完成符号扩展,得到32位有符号整数
    return (fourBits << 28) >> 28;
}

逻辑说明

  1. 提取目标位:用0b111100000掩码直接锁定原数的第5到8位,右移5位后,这4位就成为结果的低4位——相比原代码的9位掩码,这个写法更精准,不会引入无关低位。
  2. 符号扩展:
    • 先把提取到的4位数左移28位,让它的最高位(即符号位)移动到32位整数的最顶端(第31位)。
    • 执行算术右移28位:因为int是有符号类型,算术右移会自动用最高位的数值(0或1)填充所有空出的高位。如果符号位是1(代表负数),高位全填1;如果是0(代表正数),高位全填0,完美实现了原代码乘法的符号扩展效果,且全程只用位运算符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:24