仅使用按位运算符在 C++ 中对移位二进制值进行符号扩展

问题描述 投票:0回答:1

我编写了以下函数,该函数旨在提取整数的第 5 位到第 8 位(含)并返回这些位。然而,提取的位被视为有符号,因此必须在位移后对它们进行符号扩展。

int signedBits5through8(int v){
  int fourBits = (v & 0b1111111111) >> 5;
  int signBit = (fourBits & 0b1000) >> 3;
  return (0b11111111111111111111111111110000 * signBit) | fourBits;
}

为了实现符号扩展,我的实现将符号位(提取的 4 位中的最高有效位,遵循二进制补码约定)乘以 28 位 1,后跟 4 位零,以便“符号扩展”,并且然后使用 OR 掩码应用最后 4 位。我的问题是,我无法使用除按位运算符之外的任何运算符来完成此任务,因此使用乘法运算符是不可接受的。在这种情况下最好的解决方法是什么?我也不能在我的函数中使用任何条件或循环逻辑(if-else、for 等)。

c++ bit-manipulation bitwise-operators
1个回答
-1
投票

要在不使用乘法运算符的情况下实现符号扩展,可以使用按位运算来创建符号扩展掩码。这是一个替代实现: `intsignedBits5through8(int v){ int fourBits = (v & 0b1111) >> 5; int signBit = (fourBits & 0b1000) >> 3;

// 创建符号扩展掩码 int SignExtensionMask = ((signBit << 31) >> 31) << 4;

返回signExtensionMask |四位; } 在此实现中,符号扩展掩码是通过将符号位左移到最高有效位,然后将其右移回最低有效位,最后左移 4 个位置以与四个位对齐来创建的。 OR 运算将符号扩展与提取的四位结合起来。

© www.soinside.com 2019 - 2024. All rights reserved.