Dalam tutorial ini, Anda akan belajar tentang operasi bitwise yang berbeda di Swift. Ini digunakan untuk komputasi tingkat bit dalam sebuah ekspresi.
Bit digunakan untuk menunjukkan digit biner. Digit biner dapat memiliki dua kemungkinan nilai, baik 0 atau 1. Sebagai pemrogram tingkat pemula, Anda tidak harus bekerja dengan operasi pada tingkat bit.
Bekerja dengan tipe data primitif seperti: integer, float, boolean, string dll sudah cukup. Anda mungkin perlu bekerja pada tingkat bit ketika Anda berurusan dengan pemrograman tingkat rendah.
Swift menyediakan sekumpulan operator yang kaya, selain dari operator dasar, untuk memanipulasi bit. Operator ini mirip dengan operator logika, kecuali bahwa mereka bekerja pada representasi data biner (bit).
Operator bitwise adalah operator yang digunakan untuk mengubah bit individual dari sebuah operan. Operand adalah variabel atau konstanta tempat operasi dilakukan.
Semua operator bitwise yang tersedia dengan cepat tercantum di bawah ini:
1. BUKAN Operator Bitwise
Ini diwakili oleh ~
tanda tilde dan dapat diterapkan pada satu operan. Ini membalikkan semua bit. yaitu mengubah 1 menjadi 0 dan 0 menjadi 1.
Jika x adalah variabel / konstanta yang memiliki nilai biner yaitu 0 atau 1. Operasi bitwise not pada variabel x dapat direpresentasikan pada tabel di bawah ini:
TIDAKx | ~ x |
---|---|
0 | 1 |
1 | 0 |
Contoh 1: Operator Bitwise NOT untuk unsigned integer
let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Ketika Anda menjalankan program di atas, hasilnya adalah:
254
Dalam program di atas, pernyataannya let initalNumber:UInt8 = 1
adalah tipe Unsigned int dengan ukuran 8 bit. Jadi, 1 dalam desimal dapat direpresentasikan sebagai 00000001
biner.
Operator bitwise not mengubah semua bit variabel atau konstanta, bit 0 diubah menjadi 1 dan 1 menjadi 0. Jadi invertedNumber berisi bit 11111110
. Setelah mengubahnya menjadi desimal, ia direpresentasikan sebagai 254. Jadi, pernyataan itu print(invertedNumber)
menghasilkan 254 di layar.
Anda juga dapat melakukan operator bitwise langsung di bit sebagai:
Contoh 2: Operator Bitwise NOT dalam bit
let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits)
Ketika Anda menjalankan program di atas, hasilnya adalah:
0
initialBits berisi nilai biner 11111111
yang sesuai dengan 255 dalam desimal. Untuk merepresentasikan bilangan dalam biner yang kita miliki 0b
sebagai awalan dalam literal. Tanpa 0b
awalan, ini akan memperlakukannya sebagai bilangan bulat normal dan Anda akan mendapatkan kesalahan luapan (UInt8 hanya dapat menyimpan angka dari 0 hingga 255).
Karena, kita telah menggunakan operator bitwise not, itu mengubah semua 1 menjadi 0. Jadi, konstanta invertedBits berisi 00000000
yang setara dengan 0 in UInt8
.
Contoh 3: Operator Bitwise NOT untuk bilangan bulat bertanda
let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber)
Ketika Anda menjalankan program di atas, hasilnya adalah:
-2
Dalam program di atas, 1 dalam desimal dapat direpresentasikan sebagai 00000001
biner. Operator bitwise not mengubah semua bit variabel atau konstanta, bit 0 diubah menjadi 1 dan 1 menjadi 0. Jadi, invertedNumber berisi bit 11111110
. Ini harus menghasilkan 254 di layar. Namun mengembalikan -2. Aneh kan ?? Mari jelajahi di bawah ini bagaimana ini bisa terjadi.
let initalNumber:Int = 1
adalah int bertanda yang dapat menampung bilangan bulat positif dan negatif. Itulah mengapa ketika kami menerapkan operator not untuk bilangan bulat bertanda, biner yang dikembalikan juga dapat mewakili angka negatif.
Bagaimana kompilator menafsirkan -2 sebagai 11111110
biner?
Kompilator menggunakan komplemen Two untuk merepresentasikan integer. Untuk mendapatkan notasi negatif komplemen dua dari sebuah bilangan bulat, Anda harus terlebih dahulu menuliskan bilangan tersebut dalam biner kemudian membalikkan angka tersebut, dan menambahkan satu ke hasilnya.
Langkah-langkah untuk mengetahui Pelengkap Dua dari -2 :
- Tulis 2 dalam bentuk biner:
00000010
- Balikkan digitnya. 0 menjadi 1 dan 1 menjadi 0:
11111101
- Tambahkan 1:
11111110
Begitulah cara compiler mengartikan bilangan biner 1111110
seperti -2
dalam desimal. Namun, ada sedikit perubahan yang dibuat oleh kompiler yang tidak kami sadari. Itu juga menyimpulkan tipe invertedNumber sebagai Int8
tipe.
Untuk memahami ini, mari kita lihat contoh di bawah ini:
print(Int8(bitPattern: 0b11111110)) print(0b11111110)
Ketika Anda menjalankan program di atas, hasilnya adalah:
-2 254
Dalam contoh di atas, compiler memperlakukan bilangan biner menjadi -2 dalam desimal hanya untuk Integer 8-Bit yang Ditandatangani. Oleh karena itu, pernyataan print(Int8(bitPattern: 0b11111110))
mengeluarkan -2 di layar.
Tetapi untuk tipe integer normal yang ukurannya 32/64 bit dan dapat menampung nilai-nilai yang besar, itu mengartikan nilainya sebagai 254
. Oleh karena itu, pernyataan print(0b11111110)
menghasilkan 254 di layar.
2. Bitwise DAN Operator
Ini diwakili oleh &
dan dapat diterapkan pada dua operan. Operator AND membandingkan dua bit dan mengembalikan 1 jika kedua bit adalah 1, jika tidak mengembalikan 0.
Jika x dan y adalah variabel / konstanta yang memiliki nilai biner yaitu 0 atau 1. Operasi Bitwise AND pada x dan y dapat direpresentasikan pada tabel di bawah ini:
DANx | y | x & y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
1 | 0 | 0 |
Contoh 5: Operasi AND Bitwise
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result)
Ketika Anda menjalankan program di atas, hasilnya adalah:
Biner: 10000011 131
Dalam program di atas, pernyataan tersebut let result = xBits & yBits
menggabungkan bit dari dua operan xBits dan yBits. Ia mengembalikan 1 itu kedua bit adalah 1 jika tidak ia mengembalikan 0.
String(value , radix: )
penginisialisasi digunakan untuk merepresentasikan bilangan dalam sistem bilangan yang berbeda. Jika kita menyediakan nilai radix 2. Ini mengubah bilangan tersebut menjadi sistem bilangan biner. Demikian pula, kita dapat menggunakan 16 untuk hex dan 10 untuk desimal.
Pernyataan tersebut print("Binary:",String(result, radix: 2))
mengeluarkan Binary: 10000011 di layar. 10000011
setara dengan 131 dalam desimal, pernyataan tersebut print(result)
menghasilkan 131 di konsol.
3. Bitwise ATAU Operator
Ini direpresentasikan sebagai |
dan dapat diterapkan pada dua operan. Operator bitwise OR membandingkan dua bit dan menghasilkan hasil 1 jika satu atau lebih inputnya adalah 1 jika tidak 0.
Jika x dan y adalah variabel / konstanta yang memiliki nilai biner yaitu 0 atau 1. Operasi Bitwise OR pada x dan y dapat direpresentasikan pada tabel di bawah ini:
ATAUx | y | x | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 1 |
1 | 0 | 1 |
Contoh 6: Operasi Bitwise OR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result)
Ketika Anda menjalankan program di atas, hasilnya adalah:
Biner: 11111111255
Dalam program di atas, pernyataan tersebut let result = xBits | yBits
menggabungkan bit dari dua konstanta xBits dan yBits. Ia mengembalikan 1 jika salah satu bitnya adalah 1 jika tidak ia mengembalikan 0.
Pernyataan tersebut print("Binary:",String(result, radix: 2))
mengeluarkan Binary: 11111111 di layar. Karena, 11111111
setara dengan 255
dalam desimal, pernyataan tersebut print(result)
mengeluarkan 255 di layar.
4. Operator Bitwise XOR
Ini direpresentasikan sebagai ^
dan dapat diterapkan pada dua operan. Operator XOR membandingkan dua bit dan menghasilkan hasil 1 jika salah satu inputnya adalah 1 jika tidak, ia mengembalikan 0.
Jika x dan y adalah variabel / konstanta yang memiliki nilai biner yaitu 0 atau 1. Operasi Bitwise XOR pada x dan y dapat direpresentasikan pada tabel di bawah ini:
XORx | y | x y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 1 | 0 |
1 | 0 | 1 |
Contoh 7: Operasi Bitwise XOR
let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits yBits print("Binary:", String(result, radix: 2)) print(result)
Ketika Anda menjalankan program di atas, hasilnya adalah:
Biner: 1111100124
Dalam program di atas, pernyataan tersebut let result = xBits yBits
menggabungkan bit dari dua konstanta xBits dan yBits. Ia mengembalikan 1 jika salah satu bit adalah 1 jika tidak ia mengembalikan 0.
Pernyataan tersebut print("Binary:",String(result, radix: 2))
mengeluarkan Biner: 1111100 (setara dengan 01111100) di layar. Karena, 1111100
setara dengan 124
dalam desimal, pernyataan tersebut print(result)
mengeluarkan 124 di layar.
5. Operator Pergeseran Bitwise
Operator ini digunakan untuk memindahkan semua bit dalam sebuah angka ke kiri atau kanan dengan sejumlah tempat dan dapat diterapkan pada satu operan. Ini direpresentasikan sebagai <<
atau >>
.
Ada dua jenis operator shift:
Operator shift kiri bitwise
- Dilambangkan sebagai
<<
- Ini menyebabkan bit bergeser ke kiri yang ditentukan oleh nomor diikuti oleh
<<
. - Posisi bit yang telah dikosongkan oleh operasi shift diisi nol.
- Menggeser bit bilangan bulat ke kiri dengan satu posisi menggandakan nilainya
Contoh 8: Operator pergeseran kiri bitwise
let someBits:UInt8 = 0b11000100 print(someBits << 1)
Ketika Anda menjalankan program di atas, hasilnya adalah:
136
Pada program di atas, kami menggunakan operator shift kiri. Menggunakan <<
1 berarti menggeser bit sebesar 1 ke kiri. Angka digeser ke kiri dengan satu posisi, dan digit terakhir di sebelah kanan diisi dengan nol.
Anda juga dapat melihat digit yang digeser "dari ujung" dari sisi kiri hilang. Itu tidak membungkus lagi dari kanan. Menggesernya satu bit ke kiri menghapus 1 dari biner dan menambahkan 0 di kanan untuk mengisi nilai yang digeser serta sisa bit lainnya digeser ke posisi kiri sebesar 1.
Ini pengembalian 10001000
yang setara dengan 136
dalam UInt8
. Oleh karena itu, print(someBits << 1)
pernyataan menghasilkan 136 di layar.
Operator shift kanan bitwise
- Dilambangkan sebagai
>>
- Ini menyebabkan bit bergeser ke kanan dengan angka diikuti oleh
>>
- Untuk bilangan unsigned, posisi bit yang telah dikosongkan oleh operasi shift diisi dengan nol.
- Untuk bilangan bertanda (bilangan yang juga bisa negatif), bit tanda digunakan untuk mengisi posisi bit yang dikosongkan. Dengan kata lain, jika angkanya positif, 0 digunakan, dan jika angkanya negatif, 1 digunakan.
- Menggesernya ke kanan dengan satu posisi akan mengurangi separuh nilainya.
Contoh 9: Operator pergeseran kanan bitwise untuk bilangan bulat tak bertanda
let someBits: UInt8 = 4 print(someBits>> 1)
Ketika Anda menjalankan program di atas, hasilnya adalah:
2
Dalam program di atas, kami telah menggunakan operator shift kanan pada integer yang tidak bertanda tangan. Menggunakan >>
1 berarti menggeser bit sebesar 1 ke kanan. Posisi bit yang telah dikosongkan oleh operasi shift selalu diisi dengan nol pada integer yang tidak bertanda tangan.
Karena, 4 direpresentasikan sebagai 00000100
biner. Menggesernya sedikit ke kanan, mengembalikan 00000010
yang setara dengan 2
in UInt8
. Oleh karena itu, print(someBits>> 1)
pernyataan menghasilkan 2 di layar.
Contoh 10: Operator pergeseran kanan bitwise untuk bilangan bulat bertanda
let someBits:Int = -4 print(someBits>> 1)
Ketika Anda menjalankan program di atas, hasilnya adalah:
-2
Dalam program di atas, kami telah menggunakan operator shift kanan pada integer yang tidak bertanda tangan. Tidak seperti bilangan positif, menggunakan >>
untuk bilangan negatif, 1 digunakan untuk mengisi tempat kosong, bukan 0.
Karena, -4
direpresentasikan sebagai 11111100
biner. Menggesernya sedikit ke kanan dan menempatkan 1 di posisi kosong, mengembalikan 11111110
yang setara dengan -2
untuk Int8
tipe. Oleh karena itu, print(someBits>> 1)
output pernyataan -2 di layar.