でgetFieldSignExtended(int,int,int)
、if-else
ステートメント内にif-else
ステートメントがあります。int
この関数のグローバル変数として結果があります。プログラム制御が流れる場所に応じて、この関数がを返すようにしresult2
ます。
C
最初は、この関数の下部に1つのreturnステートメントがありましたが、それは機能しませんでしたが、のスコープはののようではないことがわかりましたJava
。したがってreturn 1;
、私は関数の下部にあり、ブロックreturn result2
内に8つのステートメントがあります。if-else
この機能を整理するためのより良い方法はありますか?if-else
ブロックをネストしたくないので、return
ステートメントをできるだけ少なくしたいと思います。
これは宿題ですが、すでに採点されており、発生したいくつかのエラーを修正しています。
getFieldSignExtended(int,int,int)
値からhiからloまでのビットフィールドを取得し(hiとloは互いに==になる可能性があるなど)、signはそれを拡張します(符号ビットのテストに基づく)。このコードはすべて、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;
}