ECMAScript Bit Operatörleri
- Önceki Sayfa Tekli Operatörler
- Sonraki Sayfa Mantıksal İşleçler
Bit işlevleri, sayıların alt tabakasında (yani sayıları temsil eden 32 sayı basamağı) işlemler yapar.
Tam sayıları yeniden gözden geçirme
ECMAScript tam sayıları iki türde bulunur, yani işaretli tam sayılar (pozitif ve negatif sayıları kullanmaya izin verir) ve işaretli olmayan tam sayılar (sadece pozitif sayıları kullanır). ECMAScript'te tüm tam sayı yüzeyleri varsayılan olarak işaretli tam sayılardır, bu ne anlama gelir?
İşaretli tam sayılar 31 basamakla temsil edilir, tam sayının değerini temsil etmek için 32. basamak kullanılır, 0 işaretli sayıyı, 1 negatif sayıyı temsil eder. Değer aralığı -2147483648 ile 2147483647 arasında yer alır.
İkili formatta olası olabilen işaretli tam sayıları iki farklı şekilde saklayabilirsiniz, biri pozitif sayılar için, biri negatif sayılar için. Pozitif sayılar gerçek ikili formatta saklanır, ön 31 basamak her biri 2'nin kuvvetini temsil eder, 1. basamak (basamak 0) ile başlayarak 2'yi temsil eder02'nci basamak (basamak 1) 2'yi temsil eder1Kullanılmayan basamaklar 0 ile doldurulur, yani göz ardı edilir. Örneğin, aşağıdaki resimde 18'in temsil yöntemi gösterilmektedir.

18'in ikili sürümü sadece ön 5 basamağı kullandı, bu da bu sayının geçerli basamaklarıdır. Sayıyı ikili dizgiye dönüştürdüğünüzde, geçerli basamakları görebilirsiniz:
var iNum = 18; alert(iNum.toString(2)); // "10010" yazdır
Bu kod sadece "10010" yazdırır, 18'in 32 bitlik temsilinden değil. Diğer basamaklar önemli değildir, çünkü bu ondalık değerini belirlemek için sadece ön 5 basamağı kullanılır. Aşağıdaki gibi görünüyor:

负数也存储为二进制代码,不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步:
- Negatif sayılar da ikili kod olarak saklanır, ancak ikili tam sayı kodu olarak saklanır. Sayının ikili tam sayı kodunu hesaplamak için üç adımda ilerlenir:
- Bu sayının olumsuz olmayan sürümünün ikili ifadesini belirleyin (örneğin, -18'in ikili tam sayı kodunu hesaplamak için önce 18'in ikili ifadesini belirlemek gerekir)
- İkili ters koduna 1 ekleyin
-18'in ikili ifadesini belirlemek için önce 18'in ikili ifadesini elde etmek zorundasınız, aynen aşağıdaki gibi:
0000 0000 0000 0000 0000 0000 0001 0010
Önceki olarak, ikili ters kodunu hesaplayın, aynen aşağıdaki gibi:
1111 1111 1111 1111 1111 1111 1110 1101
Son olarak, ikili ters koduna 1 ekleyin, aynen aşağıdaki gibi:
1111 1111 1111 1111 1111 1111 1110 1101 1 --------------------------------------- 1111 1111 1111 1111 1111 1111 1110 1110
Bu nedenle, -18'nın ikili ifadesi 1111 1111 1111 1111 1111 1111 1110 1110'dur. Hatırlayın ki, işaretli tam sayıları işlemekken, geliştiriciler 31. bit'e erişemez.
İlginç bir şekilde, negatif tamsayıları ikili stringe dönüştürdüğünüzde, ECMAScript ikili tam sayı kodunu ikili tam sayı olarak değil, negatif işareti ile sayının mutlak değerinin standart ikili kodu önüne ekleyerek gösterir. Örneğin:
var iNum = -18; alert(iNum.toString(2)); // "-10010" yazdırır
Bu kod, "-10010" yazdırır, bu da bit 31'e erişimi önlemek içindir. Kolaylık için ECMAScript, geliştiricilerin bunların kullanımına dikkat etmeleri gerekmeden tam sayıları basit bir şekilde işler.
Diğer yandan, işaretli tam sayılar en son biti bir başka sayı biti olarak işler. Bu模式de, 32. bit, sayının işaretini temsil etmez, aksine 2 değerini taşır.31Bu ilave bit nedeniyle, işaretli tam sayıların değer aralığı 0 ile 4294967295 arasında olacaktır. 2147483647'den küçük sayılar için işaretli tam sayılar işaretli tam sayılarla aynı gibi görünürken, 2147483647'den büyük sayılar için 31. bit (işaretli tam sayılarda bu bit her zaman 0'dır) kullanılmalıdır.
İşaretli tam sayıları stringe dönüştürdüğünüzde, sadece onların geçerli bitlerini döndürür.
Dikkat:Bütün tamsayı yazıları varsayılan olarak işaretli tam sayılar olarak saklanır. Yalnızca ECMAScript'in bit işlevleri işaretli tam sayılar oluşturabilir.
Bit işlemi NOT
Bit işlemi NOT, tırnak işareti (~) ile gösterilir ve ECMAScript'te ikili hesaplarla ilgili az sayıdaki operatörlerden biridir.
Bit işlemi NOT, üç aşamalı bir işlem sürecidir:
- İşlem sayısını 32 bitlik rakama dönüştürme
- İkili sayıyı ondalık sayının ikili karşıtı olarak dönüştürme
- İkili sayıyı ondalık sayıya dönüştürme
Örneğin:
var iNum1 = 25; // 25, 00000000000000000000000000011001'e eşittir var iNum2 = ~iNum1; // 11111111111111111111111111100110 olarak dönüştür alert(iNum2); // "-26" çıktısını verir
Bit işlemi NOT, aslında sayının negatifini almak ve 1'den çıkararak yapılır, bu yüzden 25 -26 olur. Aynı sonucu aşağıdaki yöntemle de elde edebilirsiniz:
var iNum1 = 25; var iNum2 = -iNum1 -1; alert(iNum2); // -26 çıktısını verir
Bit işlemi AND
Bit işlemi AND, simgesi (&) ile gösterilir ve doğrudan sayının ikili formuna işlem yapar. Her bir rakamı hizalayarak, aynı konumdaki iki rakamı AND işlemine tabi tutar:
İlk sayıdaki bitler | İkinci sayıdaki bitler | Sonuç |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
Örneğin, 25 ve 3 sayılarını AND işlemine tabi tutmak için aşağıdaki gibi kod kullanılır:
var iResult = 25 & 3; alert(iResult); // "1" çıktısını verir
25 ve 3'ün AND işlemi sonucu 1'dir. Neden mi? Aşağıda analiz edelim:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- AND = 0000 0000 0000 0000 0000 0000 0000 0001
25 ve 3'te sadece bir rakamın (0. bit) 1 olarak depolandığı görülebilir, bu yüzden diğer rakamlar 0 olarak oluşturulur, bu nedenle sonuç 1'dir.
Bit işlemi OR
Bit işlemi OR, simgesi (|) ile gösterilir ve doğrudan sayının ikili formuna işlem yapar. Her bir rakamı hesaplamakta, OR işlevi aşağıdaki kuralları kullanır:
İlk sayıdaki bitler | İkinci sayıdaki bitler | Sonuç |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
AND işlevini kullandığımız örneği tekrar kullanarak, 25 ve 3'ü OR işlemine tabi tutan kod şu şekildedir:
var iResult = 25 | 3; alert(iResult); // "27" çıktısını verir
25 ve 3'ün OR işlemi sonucu 27'dir:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 -------------------------------------------- OR = 0000 0000 0000 0000 0000 0000 0001 1011
İki sayı arasında, sonuçta 4 tane rakamın 1 olarak depolandığı görülebilir, bu rakamlar sonuçlara aktarılır. Binom kodu 11011, 27'ye eşittir.
Bit işlemi XOR
Bit işlemi XOR, işaret işareti ile (^) gösterilir, tabii ki, doğrudan ikili formatta çalışır. XOR, OR'dan farklıdır, sadece bir sayı biti 1 olarak saklanıyorsa 1 döner. Doğrulama tablosu aşağıdaki gibidir:
İlk sayıdaki bitler | İkinci sayıdaki bitler | Sonuç |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
25 ve 3 arasında XOR işlemi, aşağıdaki gibi kodlanmıştır:
var iResult = 25 ^ 3; alert(iResult); // Çıktı "26"
25 ve 3 arasında XOR işlemi sonuç olarak 26 verir:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- XOR = 0000 0000 0000 0000 0000 0000 0001 1010
İki sayı arasında, toplam 4 sayı biti 1 olarak saklanır ve bu bitler sonuç sayısına geçirilir. İkili kod 11010, 26'ya eşittir.
Sağa kaydırma
Sağa kaydırma işlemi iki küçük üçgen işareti ile gösterilir (<<). Bu, sayıdaki tüm bitleri belirtilen miktar kadar sağa kaydırır. Örneğin, sayı 2 (ikili 10) 5 bit sağa kaydırıldığında, sonuç 64 (ikili 1000000) olur:
var iOld = 2; // İkili 10 var iNew = iOld << 5; // İkili 1000000, ondalık 64
Dikkat:Sayıyı sağa kaydırırken, sayının sağında 5 boş bit çıkar. Sağa kaydırma işlemi bu boş bitleri 0 ile doldurur ve sonuç tam 32 bitlik bir sayı olur.

Dikkat:Sağa kaydırma işlemi sayının işaret bitini korur. Örneğin, -2 sayısını 5 bit sağa kaydardığınızda, -64 alırsınız, 64 değil. "İşaret hala 32. bitte saklanıyor mu?" Evet, ancak bu ECMAScript arka planda yapılır ve geliştirici 32. biti doğrudan erişemez. Hatta negatif sayıların ikili string biçiminde çıktısını gösterdiğinizde, negatif işaret biçiminde gösterilir (örneğin, -2 -10 olarak gösterilir).
İşaretli sağ kaydırma
İşaretli sağ kaydırma işlevi iki büyük üçgen işareti ile gösterilir (>>). Bu, 32 bitlik sayının tüm bitlerini tamamen sağa kaydırır ve bu sayının işaretini (pozitif veya negatif) korur. İşaretli sağ kaydırma işlevi, sağa kaydırmaya tamamen zıttır. Örneğin, 64 sayısını 5 bit sağa kaydardığınızda, 2 olarak değişir:
var iOld = 64; // İkili 1000000 var iNew = iOld >> 5; // İkili 10, ondalık 2
Aynı şekilde, sayı yerinde boş pozisyonlar oluşturulur. Bu sefer, boş pozisyonlar sayının solunda, ancak işaret işareti sonrasındadır. ECMAScript, bu boş pozisyonları doldurarak tam bir sayı oluşturur, aşağıdaki gibi görüldüğü gibi:

İşaretli Olmayan Sağa Doğru Kaydırma
İşaretli olmayan sağa doğru kaydırma operatörü üç büyük işaret işareti (>>>) ile temsil edilir, bu da işaretli olmayan 32 bit sayılarının tüm bitlerini genel sağa doğru kaydırır. Pozitif sayılar için, işaretli olmayan sağa doğru kaydırma işleminin sonucu işaretli sağa doğru kaydırma işleminle aynıdır.
İşaretli sağa doğru kaydırma işlemindeki örnekte, 64'ü 5 bit sağa doğru kaydırmak, 2'ye dönüşür:
var iOld = 64; // İkili 1000000 var iNew = iOld >>> 5; // İkili 10, ondalık 2
Negatif sayılar için durum farklıdır.
İşaretli sağa doğru kaydırma işleminde boş pozisyonlar 0 ile doldurulur. Pozitif sayılar için bu, işaretli sağa doğru kaydırma işleminin işleviyle aynıdır, ancak negatif sayılar negatif olarak işlenir.
İşaretli sağa doğru kaydırma işleminin sonucu 32 bitlik bir pozitif sayıdır, bu yüzden negatif sayıların işaretli sağa doğru kaydırma işlemleri, her zaman çok büyük bir sayı elde eder. Örneğin, -64'ü 5 bit sağa doğru kaydırmak, 134217726'ı elde eder. Bu sonucu nasıl elde ederiz?
Bu nedenle, bu numarayı işaretli olmayan eşdeğer formuna dönüştürmek gerekir (rağmen bu numara kendisi işaretlidir), bu formu elde etmek için aşağıdaki kod kullanılabilir:
var iUnsigned64 = -64 >>> 0;
Sonra, Number türünün toString() ile gerçek bit temsilini alarak, kullanılan taban 2:
alert(iUnsigned64.toString(2));
Bu, 11111111111111111111111111000000, yani işaretli tam sayı -64'nin ikili ikame temsilatı olacaktır, ancak bu, işaretli tam sayı 4294967232'ye eşittir.
Bu nedenle, işaretli sağa doğru kaydırma operatörünü dikkatli kullanmalısınız.
- Önceki Sayfa Tekli Operatörler
- Sonraki Sayfa Mantıksal İşleçler