0

次のシグネチャを持つ関数が必要です。

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);

その出力は、に格納されているビットの2の補数ビューがに格納されているビットの2の補数ビューよりも大きい1場合に限ります。それ以外の場合、出力はになります。例えば:ab0

signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0

関数は暗黙的/明示的な変換を行わないようにします(これらの変換は実装定義であり、したがって移植性がないため)

そのような実装の1つは次のとおりです。

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
    // if 'signed' a is positive then 
    //     return 1 if a is greater than b or b is negative
    // otherwise, if 'signed' a is negative then 
    //     return 1 if a is greater than b and b is negative
    if (a <= 0b01111111) return ((b < a) || (b > 0x01111111));
    else                 return ((b < a) && (b > 0x01111111));
}

この計算を実行するために条件ではなく算術を使用する実装を提案できますか?必要に応じて、1つの条件を使用できます

比較とCでの算術演算で符号なし/符号付き変数を組み合わせて使用​​することは、災害のレシピです。この関数は、問題を回避する方法の例です。

符号付き変数の比較の背後にあるアセンブリは、実装したい関数に似ていると思います(符号付き比較をサポートしていないアーキテクチャで)

4

2 に答える 2

6

2の補数を仮定すると:

return (a^signbit) > (b^signbit);

ここで、signbitは明らかに表現のMSBです。

于 2010-11-01T13:38:51.963 に答える
0

必要に応じて、1つの条件を使用できます

すでに1つの条件のみを使用したソリューションがあります。;)

条件文ではなく算術演算が必要なので、目標は速度だと思います。また、ルックアップテーブルの使用は、算術演算よりもさらに高速です。8ビット文字を使用しているため、ルックアップテーブルはやり過ぎがないことを意味します。サイズ256x256のテーブルも必要ありません。256のテーブルサイズは、値がtrue(またはfalse)になる可能性があることをa示す各値の制限を格納するのに完全に適切です。b各関数呼び出しは、1つのテーブルルックアップ(a-> limit)と1つの比較(limit<> b)を実行するだけで済みます。

于 2010-11-01T13:12:21.683 に答える