Bit kaydırma nedir?
Bit kaydırma, bir tam sayının ikili (binary) basamaklarını seçtiğiniz pozisyon sayısı kadar sola veya sağa taşır. Kaydırma; programlama, düşük seviyeli optimizasyon, grafik işleme, hash algoritmaları ve gömülü sistemler gibi alanlarda temel bir işlemdir. Sola kaydırma (n << k) bitleri en anlamlı uca doğru taşır ve boşalan yerleri sıfırla doldururken, sağa kaydırma (n >> k) bitleri en az anlamlı uca doğru taşır.
Bu hesaplama aracı nasıl kullanılır?
n tam sayısını, kaydırma miktarı k değerini (bit cinsinden) girin ve yönü seçin. Araç, ortaya çıkan ondalık değeri size sunar. Bu hesaplayıcı, çoğu programlama dilinin davranışıyla uyumlu olacak şekilde 64 bit işaretli (signed) tam sayı aritmetiği kullanır.
Formülün açıklaması
Tek pozisyonluk her sola kaydırma sayıyı iki katına çıkarır; dolayısıyla k pozisyon sola kaydırmak sayıyı 2k ile çarpar:
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$Tek pozisyonluk her sağa kaydırma ise sayıyı yarıya indirir (kesirli kısmı atarak); bu nedenle k pozisyon sağa kaydırma, 2k ile tam sayı bölmesi yapar:
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$İşte bu yüzden kaydırma işlemleri donanım üzerinde çarpma veya bölmeye kıyasla çok daha ucuzdur.
Çözümlü örnek
n = 16 alalım ve k = 2 kadar sola kaydıralım. İkili düzende 16 sayısı 10000'dır. İki kez sola kaydırınca sona iki sıfır eklenir: 1000000, yani 64. Matematiksel olarak
Ters yönde işlem yaparsak, \(64 \gg 2 = \left\lfloor 64 / 4 \right\rfloor = 16\) sonucu bizi başlangıçtaki değere geri getirir.
İkinin Kuvvetleri Referans Tablosu
Sola kaydırma \(k\) bir sayıyı \(2^k\) ile çarpar; sağa kaydırma \(k\) \(2^k\) ile böler (tam sayılar için kalanı atılır). Bu tabloyu kullanarak verilen kaydırma miktarı için çarpan veya böleni anında okuyabilirsiniz.
| Kaydırma \(k\) | \(2^k\) (ondalık) | \(\ll k\) / \(\gg k\) Anlamı |
|---|---|---|
| 0 | 1 | değişiklik yok |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\) (1 bayt) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\) (1 KiB) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\) (2 bayt) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 MiB |
| 32 | 4,294,967,296 | 32-bit sınırı |
| 63 | 9,223,372,036,854,775,808 | 64-bit işaretli tam sayının en yüksek biti |
Sıkça Sorulan Sorular
Sola kaydırmada veri kaybı olur mu? Evet — tam sayının bit genişliğinin ötesine taşan bitler atılır (taşma / overflow). 64 bit sınırı içinde bu hesaplayıcı değeri korur.
Negatif sayılarda sağa kaydırma nasıl davranır? Bu hesaplayıcı aritmetik (işaretli) sağa kaydırma kullanır; yani işaret biti korunur ve negatif sayılar negatif kalır.
Neden çarpma veya bölme yerine kaydırma kullanılır? Bit kaydırma işlemleri çoğu CPU'da tek çevrimde tamamlanır; bu da onları 2'nin kuvvetleriyle çarpma veya bölme için hızlı bir yöntem hâline getirir.