7

次の配列があります。

double[] list = new double[] {0,0,100,100}

検索する29.6と が表示されるのはなぜ-3ですか?

Array.BinarySearch(list, 29.6)

+1またはを期待してい-1ました。

戻りパラメーターの Array.BinarySearch() ドキュメントには、次のように記載されています。

値が見つかった場合、指定された配列内の指定された値のインデックス。value が見つからず、value が配列内の 1 つ以上の要素より小さい場合、value より大きい最初の要素のインデックスのビットごとの補数である負の数。value が見つからず、value が array 内のどの要素よりも大きい場合は、(最後の要素のインデックス + 1) のビットごとの補数である負の数。

しかし、それは私にはあまり言いません。

4

3 に答える 3

11

値が見つからず、値が配列内の1つ以上の要素よりも小さい場合、値よりも大きい最初の要素のインデックスのビット単位の補数である負の数。

29.6より大きい最初の要素は100、であり、インデックスは2。です。

~2です-3

于 2012-07-11T15:37:27.453 に答える
6

'〜'を使用してビット単位の補数を取ることができます。これにより、検索項目よりも大きい最初の項目のインデックスが得られます。

配列に指定された値が含まれていない場合、メソッドは負の整数を返します。ビット単位の補数演算子(〜)を負の結果(Visual BasicではXまたは-1の負の結果)に適用して、インデックスを作成できます。このインデックスが配列のサイズ以上の場合、配列には値より大きい要素はありません。それ以外の場合、値よりも大きいのは最初の要素のインデックスです。

MSDNから

したがって、あなたが持っていた場合:

var pos = Array.BinarySearch(list, 29.6);

確認してもいい:

if (pos < 0)
{
     Console.WriteLine("Not found, the result was {0} which is index {1}", pos, ~pos);
}

これは、あなたの場合、-3インデックス2が検索ターゲットよりも大きい最初のアイテムであることを示すことを意味します。

于 2012-07-11T15:37:43.223 に答える
1

これがあなたの答えです:「値よりも大きい最初の要素のインデックスのビット単位の補数である負の数」。

したがって、あなたの場合、検索された値(29.6)は、配列リストの3番目の要素である100未満であり、3の補数は-3であり、これが得られた答えです。

ここで、例を拡張し、いくつかの異なる値を使用して別の配列リスト(list2)を作成し、29.6と同じ値を検索しました。これで、この29.6の値は100より小さく25より大きくなり、配列リストでは100が4番目にあり、その補数は-4です。

したがって、結果は-4になります。配列リストで20を検索した場合、答えは-3になります。

 double[] list = new double[] { 0, 0, 100, 100 };
        double[] list2 = new double[] { 10, 15, 25, 100 };

        int result = Array.BinarySearch(list, 29.6);
        int result2 = Array.BinarySearch(list2, 29.6);

        Response.Write("Your answer result:" + result.ToString() + "<br/>");
        Response.Write("Your answer result2:" + result2.ToString());

私のコードの結果:

            Your answer result : -3
            Your answer result2: -4 

これがお役に立てば幸いです。

于 2012-07-11T15:56:41.713 に答える