仅使用位运算符在C++中实现移位二进制值的符号扩展
解决方案
核心思路是利用有符号整数算术右移的自动符号扩展特性,替代原代码里的乘法操作,全程只用位运算符,不用条件、循环或者乘法。
优化后的代码
int signedBits5through8(int v){ // 精准提取第5到8位(共4位,从0开始计数) int fourBits = (v & 0b111100000) >> 5; // 自动完成符号扩展,得到32位有符号整数 return (fourBits << 28) >> 28; }
逻辑说明
- 提取目标位:用
0b111100000掩码直接锁定原数的第5到8位,右移5位后,这4位就成为结果的低4位——相比原代码的9位掩码,这个写法更精准,不会引入无关低位。 - 符号扩展:
- 先把提取到的4位数左移28位,让它的最高位(即符号位)移动到32位整数的最顶端(第31位)。
- 执行算术右移28位:因为
int是有符号类型,算术右移会自动用最高位的数值(0或1)填充所有空出的高位。如果符号位是1(代表负数),高位全填1;如果是0(代表正数),高位全填0,完美实现了原代码乘法的符号扩展效果,且全程只用位运算符。
内容的提问来源于stack exchange,提问作者Mave
相关产品推荐
相关产品推荐

