2010-08-15 15 views
5

Öğe mevcut olmadığında, List<T>'un BinarySearch yöntemi hakkında kafam karıştı. beklendiği gibiC# Liste <T> .BinarySearch değeri, değer bulunamadığında döndürüldü

Ben

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

theList.BInarySearch(0) döner 0 ve theList.BInarySearch(3) döner 1 var. Ancak, theList.BinarySearch(1), -2 ve beklediğiniz gibi -1 değil. MSDN elkitabı: "Dönüş değeri: Sıralı Listedeki öğeye göre sıfır temelli öğe, öğe bulunursa, aksi halde, öğeden daha büyük olan bir sonraki öğenin dizininin bitly tamamlayıcısı olan negatif bir sayı veya eğer daha büyük bir eleman yoksa, Kont'un bitlik tamamlayıcısıdır.

A "bitwise complement"? Ne buradayım ve neden bu theList.BinarySearch(1) != -1?

+0

Sanırım "theList.BinarySearch (2)" aradınız mı? '1' burada ... – Kobi

+0

Biteks tamamlayıcı basitçe, ilk sayının her bir bitinin tamamlayıcısı olan bir sayıdır. 00110101 = ~ 11001010. Bu bir operasyon değil, ama nerede! tüm değere sahip olmayan bir boolean yapar, ~ her bitde olmaz. –

cevap

4

İlk - neden -1 beklenebilir? Öğe ilk öğe ise, -0 (tamsayılar için) döndüremez, bu nedenle ikinci öğe için -2 nedenine dönülür.

Daha sonra, ~-2 - bitwise not operatörünü kullanarak doğru dizini kolayca alabilirsiniz.

1

, bir ekleme noktasına dönüştürmek bit cinsinden eşleniğini çekmek için, yani: ~retval

7

1 var olduğundan ve 0 dönüş değeri olması gerektiğinden, theList.BinarySearch(2) hakkında konuşuyorsunuzdur.

bitwise complement operatorbitwise complement operator, karışıklığınızın kaynağı olduğunu düşündüğüm tamsayıyı reddetmekle aynı etkiyi üretmiyor. Her durumda, operatörün, arama sonucuna doğru bir şekilde nasıl bağlı olduğunu anlaması gerekmemektedir;

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

bu olumsuz indeksleri gönderilme sebebi listesine bulunmayan öğeleri ekleme desteklemektir: Sorunuza MSDN paragraf ve aslında o ~~a = a, doğrudan bu pasajı ima eder. Bu örnekte, 2, index = 2'ye eklenir. Aksi takdirde, bu konumu bulmak için başka bir ikili arama yapmanız gerekir.

+0

İlginç, Ben bu bitwise tamamlayıcının kullanımının ne olduğunu merak ediyordum ... belgelerindeki açıklama oldukça belirsiz –