Swift Bitwise ve Bit Kaydırma Operatörleri (Örneklerle)

Bu eğitimde, Swift'deki farklı bitsel işlemler hakkında bilgi edineceksiniz. Bunlar, bir ifadede bit düzeyinde hesaplama için kullanılır.

İkili bir rakamı belirtmek için bir bit kullanılır. İkili bir rakam 0 veya 1 olmak üzere iki olası değere sahip olabilir. Başlangıç ​​seviyesinde bir programcı olarak, bit seviyesinde işlemlerle çalışmak zorunda değilsiniz.

İnteger, float, boolean, string gibi ilkel veri türleri ile çalışmak yeterlidir. Düşük seviyeli programlama ile uğraşırken bit seviyesinde çalışmanız gerekebilir.

Swift, bitleri işlemek için temel operatörlerin yanı sıra zengin bir operatör seti sağlar. Bu operatörler, verilerin ikili gösterimleri (bitler) üzerinde çalışmaları dışında mantıksal operatörlere benzer.

Bitsel operatörler, bir işlenenin ayrı ayrı bitlerini değiştirmek için kullanılan operatörlerdir. Operand, işlemin yapıldığı değişken veya sabittir.

Swift'de bulunan tüm bitsel operatörler aşağıda listelenmiştir:

1. Bitwise NOT İşleci

Yaklaşık ~işareti ile temsil edilir ve tek bir işlenen üzerine uygulanabilir. Bu, tüm bitleri tersine çevirir. yani 1'den 0'a ve 0'dan 1'e değişir.

Eğer x, ikili değeri tutan bir değişken / sabitse, yani 0 veya 1. x değişkeni üzerindeki bitsel değil işlemi aşağıdaki tabloda gösterilebilir:

DEĞİL
x ~ x
0 1
1 0

Örnek 1: İşaretsiz tamsayı için Bitsel NOT operatörü

 let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 254

Yukarıdaki programda ifade let initalNumber:UInt8 = 1, 8 bitlik boyutta Unsigned int tipindedir. Dolayısıyla, ondalıkta 1 00000001ikili olarak gösterilebilir.

Bitsel değil operatörü, bir değişkenin veya sabitin tüm bitlerini değiştirir, bit 0, 1'e ve 1'den 0'a değiştirilir. Dolayısıyla, tersine çevrilmiş Sayı, bitleri içerir 11111110. Ondalık sayıya dönüştürdükten sonra 254 olarak temsil edilir. Böylece ifade print(invertedNumber)ekranda 254 çıktısı verir.

Ayrıca bitsel operatörü doğrudan bitlerde şu şekilde gerçekleştirebilirsiniz:

Örnek 2: Bit cinsinden bit tabanlı NOT operatörü

 let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 0

initialBits, 11111111ondalık olarak 255'e karşılık gelen ikili değer içerir . Sayıyı ikili 0bolarak temsil etmek için , değişmezde bir önek olarak sahibiz . 0bÖnek olmadan , onu normal bir tamsayı olarak değerlendirecek ve bir taşma hatası alacaksınız (UInt8, yalnızca 0'dan 255'e kadar sayıları saklayabilir).

Bitsel değil operatörü kullandığımız için, tüm 1'i 0'a değiştirir. Dolayısıyla, invertedBits sabiti 0 in'e 00000000eşdeğer olanı içerir UInt8.

Örnek 3: İşaretli tamsayı için Bitwise NOT operatörü

 let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 -2

Yukarıdaki programda, ondalık olarak 1 00000001, ikili olarak temsil edilebilir . Bitsel değil operatörü bir değişkenin veya sabitin tüm bitlerini değiştirir, bit 0 1'e ve 1'den 0'a değiştirilir. Dolayısıyla, tersine çevrilmişNumara bitleri içerir 11111110. Bu ekranda 254 çıktı vermelidir. Ancak bunun yerine -2 döndürür. Garip, değil mi? Aşağıda bunun nasıl olduğunu inceleyelim.

let initalNumber:Int = 1hem pozitif hem de negatif tam sayıları tutabilen işaretli bir tamsayıdır. Bu nedenle işaretli bir tamsayı için not operatörü uyguladığımızda, döndürülen ikili de negatif bir sayıyı temsil edebilir.

Derleyici -2'yi 11111110 ikili olarak nasıl yorumladı ?

Derleyici, tamsayıları temsil etmek için Two'nun tümlemesini kullandı. Bir tamsayının ikisinin tamamlayıcı negatif gösterimini elde etmek için, önce sayıyı ikili olarak yazmalı, ardından rakamları ters çevirmeli ve sonuca bir eklemelisiniz.

İki'nin -2'yi tamamlayacağını bulmak için adımlar :

  1. İkili biçimde 2 yazın: 00000010
  2. Rakamları ters çevirin. 0 1 olur ve 1 0 olur:11111101
  3. 1 ekleyin: 11111110

Derleyici, ikili sayıyı ondalık sayıdaki 1111110gibi yorumlar -2. Ancak, derleyicinin yaptığı ve fark etmediğimiz küçük bir bükülme var. Ayrıca, tür olarak tersNumara türünün türünü de çıkardı Int8.

Bunu anlamak için aşağıda bir örnek görelim:

 print(Int8(bitPattern: 0b11111110)) print(0b11111110)

Yukarıdaki programı çalıştırdığınızda, çıktı:

 -2 254

Yukarıdaki örnekte, derleyici ikili sayıyı yalnızca Signed 8-Bit Tamsayı için ondalık sayı olarak -2 olarak işlemiştir. Bu nedenle ifade print(Int8(bitPattern: 0b11111110))ekranda -2 çıktılar.

Ancak boyutu 32/64 bit olan ve büyük değerler tutabilen normal tamsayı türü için değeri olarak yorumlar 254. Bu nedenle, deyim print(0b11111110)çıkışı 254 ekranında.

2. Bitsel VE İşleci

&İki işlenen ile temsil edilir ve uygulanabilir. AND operatörü iki biti karşılaştırır ve her iki bit 1 ise 1 döndürür, aksi takdirde 0 döndürür.

X ve y, ikili değeri tutan değişken / sabit ise, yani 0 veya 1. x ve y üzerindeki Bitsel AND işlemi aşağıdaki tabloda gösterilebilir:

VE
x y x & y
0 0 0
0 1 0
1 1 1
1 0 0

Örnek 5: Bitsel AND işlemi

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)

Yukarıdaki programı çalıştırdığınızda, çıktı:

 İkili: 10000011 131 

Yukarıdaki programda, ifade let result = xBits & yBitsiki işlenen xBits ve yBits'in bitlerini birleştirir. 1 döndürür, her iki bit de 1'dir, aksi takdirde 0 döndürür.

String(value , radix: )Başlatıcı, farklı sayı sistemlerinde sayıyı temsil etmek için kullanılır. Radix değeri 2 verirsek, sayıyı ikili sayı sistemine çevirir. Benzer şekilde, onaltılık için 16 ve ondalık için 10 kullanabiliriz.

İfadesi print("Binary:",String(result, radix: 2))çıkışları Binary: 10000011 ekranında. 10000011ondalık sayı olarak 131'e eşdeğerdir, ifade print(result)konsolda 131 çıktısı verir.

3. Bitsel VEYA İşleci

|İki işlenen olarak temsil edilir ve uygulanabilir. Bitsel OR operatörü iki biti karşılaştırır ve bir veya daha fazla girdisi 1 ise, aksi takdirde 0 ise 1 sonucunu oluşturur.

Eğer x ve y, ikili değeri tutan değişken / sabit ise, yani 0 veya 1. x ve y üzerindeki Bitsel OR işlemi aşağıdaki tabloda gösterilebilir:

VEYA
x y x | y
0 0 0
0 1 1
1 1 1
1 0 1

Örnek 6: Bitsel OR işlemi

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 İkili: 11111111 255 

Yukarıdaki programda ifade let result = xBits | yBits, xBits ve yBits sabitlerinin bitlerini birleştirir. Bitlerden herhangi biri 1 ise 1 döndürür, aksi takdirde 0 döndürür.

İfadesi print("Binary:",String(result, radix: 2))çıkışları Binary: 11111111 ekranında. Beri 11111111eşdeğerdir 255onlu, deyim print(result)çıkışı 255 ekranında.

4. Bitsel XOR operatörü

^İki işlenen olarak temsil edilir ve uygulanabilir. XOR operatörü iki biti karşılaştırır ve girdilerinden tam olarak biri 1 ise 1 sonucunu üretir, aksi takdirde 0 döndürür.

X ve y, ikili değeri tutan değişken / sabitse, yani 0 veya 1. x ve y üzerindeki Bitsel XOR işlemi aşağıdaki tabloda gösterilebilir:

ÖZELVEYA
x y x y
0 0 0
0 1 1
1 1 0
1 0 1

Örnek 7: Bitsel XOR işlemi

 let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 İkili: 1111100124 

Yukarıdaki programda ifade let result = xBits yBits, xBits ve yBits sabitlerinin bitlerini birleştirir. Bitlerden biri 1 ise 1 döndürür, aksi takdirde 0 döndürür.

İfadesi print("Binary:",String(result, radix: 2))çıkışları Binary: 1111100 ekranında (01111100 eşdeğerdir). Beri 1111100eşdeğerdir 124onlu, deyim print(result)çıkışı 124 ekranında.

5. Bit Düzeyinde Kaydırma Operatörü

Bu operatörler, bir sayıdaki tüm bitleri belirli sayıda basamağa kadar sola veya sağa hareket ettirmek için kullanılır ve tek işlenene uygulanabilir. <<Veya olarak temsil edilir >>.

İki tür vardiya operatörü vardır:

Bitsel sola kaydırma operatörü

  • Olarak gösterilir <<
  • Bitlerin sayı ile belirtilen sola kaydırılmasına neden olur <<.
  • Kaydırma işlemi ile boşaltılan bit pozisyonları sıfır doludur.
  • Bir tamsayının bitlerini bir konum sola kaydırmak, değerini ikiye katlar

Örnek 8: Bitsel sola kaydırma operatörü

 let someBits:UInt8 = 0b11000100 print(someBits << 1) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 136

Yukarıdaki programda sol kaydırma operatörünü kullandık. <<1 kullanmak , biti 1 sola kaydırmak anlamına gelir. Rakamlar bir sıra sola kaydırılır ve sağdaki son rakam sıfır ile doldurulur.

Sol taraftan " sondan kaymış " rakamın kaybolduğunu da görebilirsiniz. Sağdan tekrar sarmaz. Bir bit sola kaydırıldığında 1 ikiliden çıkarılır ve kaydırılan değeri doldurmak için sağa 0 ekler ve diğer bitlerin geri kalanı 1 sola kaydırılır.

Bu döner 10001000eşdeğerdir 136olarak UInt8. Bu nedenle, print(someBits << 1)ifade ekranda 136 çıktı verir.

Bitsel sağa kaydırma operatörü

  • Olarak gösterilir >>
  • Bitlerin sağa, ardından sayı ile kaydırılmasına neden olur. >>
  • İşaretsiz sayılar için, kaydırma işlemi ile boşaltılan bit konumları sıfır doludur.
  • İşaretli sayılar için (negatif de olabilen sayılar), işaret biti boş bit konumlarını doldurmak için kullanılır. Diğer bir deyişle sayı pozitif ise 0, negatif ise 1 kullanılır.
  • Bir konum sağa kaydırmak değerini yarıya indirir.

Örnek 9: İşaretsiz tamsayı için bitsel sağa kaydırma operatörü

 let someBits: UInt8 = 4 print(someBits>> 1) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 2

Yukarıdaki programda işaretsiz bir tamsayı üzerinde sağa kaydırma operatörü kullandık. >>1 kullanmak , biti 1 sağa kaydırmak anlamına gelir. Kaydırma işlemi tarafından boşaltılan bit konumları her zaman işaretsiz bir tamsayı üzerinde sıfırla doldurulur.

Çünkü 4 00000100ikili olarak temsil edilir . Sağa, geri dönüşler için onu bir bit kaydırmak 00000010eşdeğerdir 2içinde UInt8. Bu nedenle, print(someBits>> 1)ifade ekranda 2 çıktı verir.

Örnek 10: İşaretli tamsayı için bit düzeyinde sağa kaydırma operatörü

 let someBits:Int = -4 print(someBits>> 1) 

Yukarıdaki programı çalıştırdığınızda, çıktı:

 -2

Yukarıdaki programda işaretsiz bir tamsayı üzerinde sağa kaydırma operatörü kullandık. Pozitif sayılardan farklı olarak, >>negatif sayılar için kullanıldığında, 0 yerine 1 boş yeri doldurmak için kullanılır.

Beri, ikili -4olarak temsil edilir 11111100. Bir bit sağa kaydırıp boş konuma 1 yerleştirmek, for türüne 11111110eşdeğer olan döndürür . Bu nedenle, ifade ekranda -2 çıktılar.-2Int8print(someBits>> 1)

Ilginç makaleler...