著作一覧 |
追記:.NETは関係ないよ。32ビット整数と64ビット整数を持つ処理系の 話だ。手元でcscがすぐ動く環境でたまたま書いてたからC#で書いてるだけ。でもまあ、おもしろいので『整数型に対する Compare の実装』も参照すると良いかも。(さらに追記:ああ、意図がわかったかも。正しい実装(HardCmp)については自分で実装しなくても良いってことか。まあ、それは実装の比較ということでというか.NETの実装を使ってはあまり意味がない、と多分NyaRuRuさんはわかってるので別の話を展開して、というのが流れか)
どうやれば比較しないで済むか試したが僕にはえらく難しかった。
とりあえず、こんなものしかできなかった(最初、比較関数の中でプリントまでしてたのでえらく簡単だったがintを戻すように変えた瞬間から困ったことになったのであった)。
public class Cmp { static void ShowResult(string p, int result) { System.Console.WriteLine("{0} {1}", p, (result == 0) ? "0" : (result < 0) ? "-" : "+"); } static int FastCmp(int x, int y) { return x - y; } static int HardCmp(int x, int y) { return (x == y) ? 0 : (x > y) ? 1 : -1; } static int Bogus(int x, int y) { long l = (long)x - (long)y; return (int)(l >> 1 | l & 0x7fffffff); } delegate int comp(int x, int y); public static void Main() { comp[] fns = { FastCmp, HardCmp, Bogus }; int[][] checks = { new int[]{ 5, 4, }, new int[]{ 4, 4, }, new int[]{ 4, 5, }, new int[]{ -4, -5, }, new int[]{ -4, -4, }, new int[]{ -5, -4, }, new int[]{ 1, -1, }, new int[]{ -1, -1, }, new int[]{ -1, 1, }, new int[]{ int.MinValue, int.MaxValue, }, new int[]{ int.MaxValue, -1 }, new int[]{ 0, int.MinValue }, }; foreach (int[] check in checks) { System.Console.WriteLine("--- cmp({0}, {1}) ---", check[0], check[1]); foreach (comp c in fns) { ShowResult(c.Method.Name, c(check[0], check[1])); } } } }最後が本当に
l >> 32 & 0x80000000
でよいのか自信がない。l >> 32 & 0x80000001
としなければならないことにはならないとは思うんだけど。
元は比較関数、の反応、むむ。(RSSリーダの巡回順にこの順で出てきておもしろかったわけだが。というか、intは30ビットで収まるあたり、longは60ビットで収まるあたりで大体使うもんじゃないか? と思ったけど汎用ライブラリではそうもいかないわけですな)
追記:上で33ビット目が立つかとか書いてるが、立たないはずなので、するとMSBを持ってくる必要がなくなってさらに小さくなった。
それにしてもwhere句の指定方法ってK&Rみたいだな。
誠に申し訳ございませんがご注文いただいた以下の商品がまだ確保 できておりません。 細野晴臣 (アーティスト) "ハリーホソノ クラウン イヤーズ オブ 1975-1976 (DVD付) [Box set] [Live]" [CD] 商品の発送が4~6週間ほど遅れます。そんなぁ。 ハリー細野 クラウン・イヤーズ1974-1977(細野晴臣)
このメソッドは、QuickSort アルゴリズムを使用します。この実装では不安定な並べ替えを実行します。つまり、2 つの要素が等しかった場合、これらの順序は保持されない可能性があります。一方、安定した並べ替えでは、等しい要素の順序が保持されます。 ――Array.Sort メソッドなんて書いてあるなぁ。 Javaの場合、Comparator<? super T>は同様に3値(というか、正、0、負)を返すだけに、
This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort. ――Arrays.sortとなっているけど。これは.NETのドキュメントがおかしいのではなかろうか。とまで思ったけど、QuickSortを使うと書ききっているので、単にJavaのComparatorに合わせただけなのかも(Javaはマージソートを使うとなっている)。
ジェズイットを見習え |