好的,我已经阅读了很多关于符号扩展的内容,但我对 C 以及所有“位运算符”都是全新的,所以我仍然无法弄清楚我应该如何在 C 中实际实现它。
我有一个调用的函数getField
,它应该返回一个较大位中的一大块位的值。它需要三个整数:value
、hi
和lo
加上一个 bool:isSigned
作为参数。例如,此调用应返回 2:
return getField(9, 5, 2, 0);
我的功能有效,除非数字签名。在阅读了符号扩展后,我认为我的理解是,如果isSigned
是,true
那么我需要在位中添加一个,因此在上面的示例中,解决方案 ( 0010
) 将变为 ( 111...0010
)。这是我处理使数字签名的代码(result
等于函数将返回的内容,如果isSigned
是false
):
if (isSigned) {
return (~result) + 1;
}
如果我应该返回 2s 补码有符号整数,这将起作用,但遗憾的是这不是我应该做的。任何帮助表示赞赏。
编辑:这是该方法的完整代码...
int getField (int value, int hi, int lo, bool isSigned) {
int mask;
//Make Sure 'hi' is the high value
if (hi < lo) {
int temp = hi;
hi = lo;
lo = temp;
}
int numberOfBits = (hi - lo) + 1;
mask = ((1 << numberOfBits) - 1) << lo;
int result = value & mask;
//Get rid of LSB if value is zero
result = result >> lo;
if (isSigned) { //Sign Extension instead of Twos Complement
return (~0) << numberOfBits | result;
}
else {
return result;
}
}
(注:我确实看到过类似的帖子,我读了它,但我仍然很困惑,所以我决定写一个不同的。对不起,如果这违反了规则。)