7

我有以下数组:

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

为什么如果我搜索29.6我得到-3

Array.BinarySearch(list, 29.6)

我预计+1-1

返回参数的 Array.BinarySearch() 文档说:

指定数组中指定值的索引(如果找到值)。如果未找到 value 并且 value 小于数组中的一个或多个元素,则为负数,它是大于 value 的第一个元素的索引的按位补码。如果未找到 value 并且 value 大于数组中的任何元素,则为一个负数,它是 (最后一个元素的索引加 1) 的按位补码。

但这对我来说并没有说太多。

4

3 回答 3

11

如果未找到 value 并且 value 小于数组中的一个或多个元素,则为负数,它是大于 value 的第一个元素的索引的按位补码。

大于 29.6 的第一个元素是100,其索引为2

~2-3

于 2012-07-11T15:37:27.453 回答
6

您可以使用“~”进行按位补码,这将为您提供大于搜索项的第一项的索引。

如果 Array 不包含指定的值,则该方法返回一个负整数。您可以将按位补码运算符 (~) 应用于负结果(在 Visual Basic 中,将负结果与 -1 进行异或)以生成索引。如果此索引大于或等于数组的大小,则数组中没有大于 value 的元素。否则,大于 value 的是第一个元素的索引。

来自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) 小于 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 回答