論理演算を用いずに2数の最大値を求める

9653 ワード

次に、論理演算を使用しない2つの最大値を求めるアルゴリズムについて説明します.
 
アルゴリズム1
  int max(const int *p, const int *q) {     int array[] = {*p, *q};     return array[(unsigned)(*- *q) >> (sizeof(int) * 8 - 1)]; }
アルゴリズム2int max(const int *p, const int *q) {     return (((*+ *q) + abs(*- *q)) / 2); }
分析:アルゴリズムはコンピュータシステムの中の数の記憶方式を利用してその補符号という特性である.符号化の最上位は符号ビットであり,正であれば最上位は0,逆であれば1である.右シフト演算によりその最上位値が得られる.符号なし数に変換するのは、符号なし数が右にシフトすると左高位が0にシフトし、符号付き数に対して、元のシンボルビットが0の場合(この数が正の場合)左も0に移動するが、符号ビットが1の場合、左が0に移動するか1に移動するかは不明であり、使用するコンピュータシステムに依存する.*pが*qより大きい場合、右が0に移動すると、関数は配列中に0と表記された要素、すなわち*pを返し、逆に*qを返す.欠点:*pと*qの差が2^31より大きい場合、アルゴリズムはエラーとなる.アルゴリズム2はの関数aを利用するbs().aがbより大きい場合、
abs(a - b) = a - b(a + b + abs(a - b))/2 = (a + b + a - b)/2 = a
aがbより小さい場合、
abs(a - b) = b - a(a + b + (abs(a - b))/2 = (a + b + b - a)/2 = b
欠点:ライブラリ関数を呼び出す.(a+b+abs(a-b))a,bの最大値の絶対値を2^30未満にするとオーバーフローする可能性があります(符号数の表示範囲を考慮すると-2^31~2^31-1).
注意:C 99符号の標準ANSI Cライブラリにabs()が含まれています.
に表示されます.