En Yüksek Bit'i Bulma (Bit Scan Reverse)
Son güncelleme 6 Ağustos 2006 Pazar
Bir sayıdaki en yüksek basamaklı bit'den başlayarak ilk 1 değerli bit'i bulmak için x86 assembly'de BSR (Bit Scan Reverse) isimli bir komut vardır. C#'da ya da MSIL'de buna karşılık gelen bir komut malesef yok ama Visual C++ 8'de (VS.Net 2005) intrin.h'ı include ettiğinizde _BitScanReverse adıyla aynı işi gören bir fonksiyon geliyor.
Bu fonksiyonu hazırlarken de 4 farklı varyasyon çıktı. Hangisinin daha iyi olduğunu test ederek hızlı olanı seçtik ve sonucu sizlerle paylaşıyoruz.
Fonksiyonlardan dördü de aynı işi yapıyor, 64-bit unsigned integer (C#'da ulong, vb.net'de ise malesef işaretsiz tamsayılar framework 2.0'a kadar yok) bir sayıdan en yüksek set bit nosunu integer olarak döndürüyor, sayı 0 ise -1 dönüyor. Bu arada logaritma kullanan son fonksiyon sayı büyüdükçe doğru sonuç vermekten uzaklaşıyor.
Konuya uzak arkadaşlar için en yüksek bit'den neleri ifade etmek istediğimizi açarsak;
bit no : 7 6 5 4 3 2 1 0
- - - - - - - -
örnek sayı : 0 0 1 0 0 1 1 0 (38)
|
|__ soldan ilk 1 bit, basamak nosu 5
Yukarıdaki örnekte de görüldüğü gibi EnYuksekBit(38) fonksiyonu çağırıldığında 5 döner (sayı 0 olsaydı sonuç -1 dönerdi).
Aşağıda yer alan kod, 4 fonksiyondan en optimize olanı
EnYuksekBit fonksiyonunun kullanım alanına örnek olarak byte uzunluk verildiğinde veri boyutunu birimli olarak döndüren bir fonksiyon yazabiliriz. Mesela 1937495 verdiğinizde 1,85 MB döndürecek:
Hazır yeri gelmişken bit test etme, bit silme ve bit set etme fonksiyonlarını da verelim:
argelab_en_yuksek_bit.zip (79K)
ArgeLab.net, bu sitenin
eksiksiz ve hatasız olduğu
konusunda bir garanti veremez. Bu sitede yer alan bilgilerin ve
programların kullanımı sonucu oluşabilecek zararlardan
sorumlu tutulamaz.