C# Список.BinarySearch возвращает значение, если значение не найдено

Я запутался в методе BinarySearch List<T> в случае, если элемент не существует.

у меня есть

List<long> theList = {1, 3, 5, ...}.

theList.BInarySearch(0) возвращает 0, а theList.BInarySearch(3) возвращает 1, как и ожидалось.

, theList.BinarySearch(1) возвращает -2, а не -1, Как я ожидал. В руководстве MSDN говорится: "Возвращаемое значение: нулевой индекс элемента в отсортированном списке, если элемент найден; в противном случае отрицательное число, которое является побитовым дополнением индекса следующего элемент, который больше элемента или, если нет большего элемента, побитовое дополнение Count."

"побитовое дополнение"? Что я упускаю здесь и почему это theList.BinarySearch(1) != -1 ?

4 ответов


во - первых- почему вы ожидаете -1? Если элемент является первым элементом, он не может вернуться -0 (для целых чисел), поэтому причина -2 будет возвращена для второго элемента.

Далее, вы можете легко получить правильный индекс с помощью ~-2 - побитовый оператор not.


Я предполагаю, что вы говорите о theList.BinarySearch(2), потому что и возвращаемое значение должно быть 0.

на оператор побитового дополнения не производит такого же эффекта, как отрицание целого числа, которое, я думаю, является источником вашей путаницы. В любом случае, вам не нужно понимать, как работает оператор, чтобы точно ветвиться на результат поиска; абзац MSDN в вашем вопросе, и тот факт, что ~~a = a, непосредственно подразумевает этот фрагмент:

int index = theList.BinarySearch(num);

if (index >= 0)
{
    //exists
    ...
}
else
{
    // doesn't exist
    int indexOfBiggerNeighbour = ~index; //bitwise complement of the return value

    if (indexOfBiggerNeighbour == theList.Count)
    {
        // bigger than all elements
        ...
    }

    else if (indexOfBiggerNeighbour == 0)
    {
        // smaller than all elements
        ...
    }

    else
    {
        // Between 2 elements
        int indexOfSmallerNeighbour = indexOfBiggerNeighbour - 1;
        ...
    }
}

причиной возврата этих отрицательных индексов является поддержка вставки элементов, которые не найдены в списке. В этом примере 2 будет вставлен при index = 2. В противном случае вам придется выполнить другой двоичный поиск, чтобы найти эту позицию.


чтобы преобразовать его в точку вставки, возьмите побитовое дополнение, то есть: ~retval