2012-01-18 8 views
0

私はcomparers( "=="、 "!="、 ">"、 "<なし配列のリストから最小値を返さなければならない関数を実装しようとしています"、"> = "、" < = ")ですが、簡単にするために、私は2つの変数で作業します。 2つの値があるとします。数字5が "a"、数字35が "b"と宣言されているので、符号なし整数ではなく2つの整数の最小値を得る方法を見つけました。最小値を2符号なしintから取得

b + ((a - b) & ((a - b) >> 31)); 

誰も助けてくれますか?

+4

http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMaxのようなものはありますか? – kennytm

+0

このint型のコードは整数オーバーフローしやすく、(符号付き)整数オーバーフローは未定義の動作であることに注意してください。例えば、 'a == 0'と' b == INT_MIN'の場合は、期待される結果を返さないかもしれません。 – ouah

答えて

3

安価な&:32ビットの符号なし整数を使用している場合は、64ビット符号付き整数にキャストし、上記のコードを使用できます。

+0

(+1)は、すでに解決されている問題に問題を減らすためです。 :) – NPE

+0

素敵な、これは完璧な解決策です! – Gandarez

+0

@MarkB上記のコードには、右のくそに関連する不特定の動作はありません。しかし、上記の右シフト演算は、符号付きの負の左オペランドで定義された実装です。しかし、コンパイラが 'gcc'の場合、' gcc'はそれが符号拡張をしていると言います。 – ouah

1

タイプキャスティングは、コストのかかる操作です。ビット単位で最小値を計算したい

関連する問題