在getFieldSignExtended(int,int,int)
中,我在if-else
语句中有if-else
语句。我将int
结果作为此函数的全局变量。根据程序控制流向的位置,我希望此函数返回result2
.
起初我在这个函数的底部有一个 return 语句,它不起作用,我发现范围 inC
不像 in Java
。因此,我return 1;
位于函数的底部,并且块return result2
中有 8 条语句if-else
。
有没有更好的方法来组织这个功能?我不想嵌套if-else
块,我想要尽可能少的return
语句。
这是家庭作业,但它已经评分,我只是更正一些出现的错误。
getFieldSignExtended(int,int,int)
从值从 hi 到 lo (包括 hi 和 lo 可以是 == 等)获取一个位域并对其进行符号扩展(基于测试符号位)。所有这些代码都处理 2 的补码。
如果您发现任何其他大的 C 约定错误,我将很乐意纠正它们。
提前致谢。
int getFieldSignExtended (int value, int hi, int lo) {
unsigned int result = 0;
int result2 = 0;
unsigned int mask1 = 0xffffffff;
int numberOfOnes = 0;
if((hi == 31) && (lo == 0)) {
result2 = value;
return result2;
}
if((lo == 31) && (hi == 0)) {
result2 = value;
return result2;
}
else if(hi < lo) {
// Compute size of mask (number of ones).
numberOfOnes = lo-hi+1;
mask1 = mask1 << (32-numberOfOnes);
mask1 = mask1 >> (32-numberOfOnes);
mask1 = mask1 << hi;
result = value & mask1;
result = result >> hi;
if(result & (0x1 << (numberOfOnes-1))){
// if negative
int maskMinus = (0x1 << numberOfOnes);
maskMinus = maskMinus -1;
maskMinus = ~maskMinus;
result2 = maskMinus | result;
}
} else if(lo < hi) {
// The number of ones are at the 'far right' side of a 32 bit number.
numberOfOnes = hi-lo+1;
mask1 = mask1 >> (32-numberOfOnes);
mask1 = mask1 << lo;
result = value & mask1;
result = result >> lo;
if(result & (0x1 << (numberOfOnes-1))){
//if negative
int maskMinus = (0x1 << numberOfOnes);
maskMinus = maskMinus -1;
maskMinus = ~maskMinus;
result2 = maskMinus | result;
return result2;
}
}else{
// hi == lo
unsigned int mask2 = 0x1;
// Move mask2 left.
mask2 = mask2 << hi;
result = mask2 & value;
result = result >> hi;
if(result == 0x1){
result2 = 0xffffffff;
return result2;
}
else{
result2 = 0x0;
return result2;
}
}
return 1;
}