Tüm makaleler

Bit düzeyi işlemler: AND, OR ve XOR bit seviyesinde nasıl çalışır

Bir SaaS ürününde özellik bayrakları (feature flag) genellikle tek bir tam sayının bitlerinde saklanır: her yeni özellik bir bite karşılık gelir, ve bir kullanıcı için hangi özelliklerin açık olduğunu kontrol etmek tek bir AND işlemine iner. Yüzlerce ayrı boolean sütun yerine tek bir sayı yeterlidir.

AND, OR, XOR, NOT — dört temel işlem

  • AND (&) — sonuç biti yalnızca her iki giriş biti de 1 ise 1'dir. Bir bayrak kümesinde belirli bir özelliğin açık olup olmadığını kontrol etmek için kullanılır.
  • OR (|) — giriş bitlerinden en az biri 1 ise sonuç biti 1'dir. Birden fazla bayrağı tek bir değerde birleştirmek için kullanılır.
  • XOR (^) — giriş bitleri farklıysa sonuç biti 1'dir; aynı değerle iki kez XOR uygulamak orijinali geri döndürür.
  • NOT (~) — bir sayının her bitini tersine çevirir.

Bit düzeyi AND, mantıksal AND'den nasıl farklıdır

Mantıksal AND (çoğu dilde &&) tüm boolean değerlerle çalışır ve true/false döndürür, bit düzeyi AND (&) ise iki sayının her bitini ayrı ayrı işler ve bir sayı döndürür. İkisini karıştırmak yaygın bir bug kaynağıdır, özellikle bazı dillerde ikisi de tip hatası vermeden derlenebildiği için.

Bu araç neden taban dönüştürücüyle birlikte kullanılır

Onluk sistemde 18 değerindeki bir bayrak kümesi ilk bakışta hiçbir şey söylemez, ama aynı değer 0b10010 olarak yazıldığında hangi bitlerin açık olduğu anında görülür. Bit düzeyi işlemler bu yüzden neredeyse hiç ondalık sistemde değil, ikilik ya da on altılık düzende düşünülür — taban dönüştürücü genelde AND/OR/XOR'un görsel olarak anlam kazanmasından önceki ilk adımdır.

Bu neden gereklidir

  • Bir dizi boolean bayrağı tek bir sayıda verimli bir şekilde saklamak ve kontrol etmek.
  • Ağ protokolleri veya ikili biçimlerle çalışan düşük seviyeli kodu anlamak.
  • Bit düzeyi işlemlerin normal aritmetikten daha hızlı olduğu hesaplamaları optimize etmek.

Operatör önceliği tuzağı

Çoğu programlama dilinde & ve | bit düzeyi operatörleri, karşılaştırma operatörlerinden daha düşük önceliğe sahiptir — bu yüzden if (a & b == c) gibi bir ifade aslında yazarın beklediği gibi değil, a & (b == c) şeklinde değerlendirilir. Bu, bit maskeleriyle çalışırken karşılaşılan en yaygın gizli hata kaynaklarından biridir ve bundan kaçınmanın güvenilir yolu, bit düzeyi işlemleri her zaman açıkça parantez içine almaktır.

Aracı dene