Bit Manipulation
Apa itu Bit Manipulation? Bit Manipulation adalah tindakan memanipulasi bit secara algoritmik atau data lain yang lebih pendek atau kecil dari satu byte. Dan bahasa C sangat efisien dalam melakuakn memanipulasi bit ini.
Sayangnya Bahasa C tidak memiliki fungsi bawaan untuk menampilkan angka dalam bentuk binary jadi kita harus membuat fungsi kita sendiri. Berikut contohnya:
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n) {
for (unsigned int i = 1 << (BIT_LENGTH - 1); i > 0; i /= 2) {
if ((n & i) != 0) {
printf("1");
}
else {
printf("0");
}
}
}
int main() {
BIT_LENGTH = 4;
printf("Angka 5 Dalam bentuk binary = ");
printBinary(5);
printf("\n");
printf("Angka 2 Dalam bentuk binary = ");
printBinary(2);
printf("\n");
}
/*
Output:
Angka 5 Dalam bentuk binary = 0101
Angka 2 Dalam bentuk binary = 0010
*/
Cara diatas mungkin bukan cara yang terbaik untuk mencetak angka dalam bentuk binary, tetapi yang penting adalah kita dapat memahami binary-nya terlebih dahulu.
Bitwise Operators
| Operator | Nama Operator |
|---|---|
| & | Bitwise AND |
| | | Bitwise OR |
| ^ | Bitwise XOR |
| ~ | Bitwise NOT (unary) |
<< | Left shift |
>> | Right shift |
Bitwise AND ( & )
Operator biner yang beroperasi dengan melakukan perbandingan pada tiap bit. Jika kedua bit yang dibandingkan bernilai 1, makahasil bitnya adalah 1, jika tidak 0.
Contoh 9 & 5
9 --> 1001
5 --> 0101
----
= 0001 => 1
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 4;
printf("Hasil dari 9 & 5 = %d\n", (9 & 5));
printBinary(9);
printf("\n");
printBinary(5);
printf("\n");
printf("------ &\n");
printBinary(9 & 5);
printf("\n");
}
Bitwise OR ( | )
Operator biner yang beroperasi dengan melakukan perbandingan pada tiap bit. Jika salah satu atau kedua bit yang dibandingkan bernilai 1, maka hasil bitnya adalah 1, jika tidak 0.
Contoh 9 | 5
9 --> 1001
5 --> 0101
----
= 1101 => 13
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 4;
printf("Hasil dari 9 | 5 = %d\n", (9 | 5));
printBinary(9);
printf("\n");
printBinary(5);
printf("\n");
printf("------ |\n");
printBinary(9 | 5);
printf("\n");
}
Bitwise XOR ( ^ )
Operator biner yang beroperasi dengan melakukan perbandingan pada tiap bit. Jika salah satu bit yang dibandingkan bernilai 1 (bukan keduanya), maka hasil bitnya adalah 1, jika tidak 0.
Contoh 9 ^ 5
9 --> 1001
5 --> 0101
----
= 1100 => 12
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 4;
printf("Hasil dari 9 ^ 5 = %d\n", (9 ^ 5));
printBinary(9);
printf("\n");
printBinary(5);
printf("\n");
printf("------ ^\n");
printBinary(9 ^ 5);
printf("\n");
}
Bitwise NOT ( ~ )
Bitwise NOT adalah operator unary yang membalik bit angka. Jika bit ke-i adalah 0, maka akan dibalik menjadi 1 dan begitu pula sebaliknya.
Contoh ~9
9 --> 1001
----
= 0110 => 6
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 4;
printf("Hasil dari ~9 = %d\n", ~9 & 15);
printBinary(9);
printf("\n");
printf("------ ~\n");
printBinary(~9);
printf("\n");
}
Kenapa kita menggunakan & 15 dalam operasi diatas?
Hal ini karena operator NOT bekerja dengan membalikkan semua bit, tidak bisa dibatasi.
Misalnya:
9 = ...0000 0000 0000 1001
~9 = ...1111 1111 1111 0110
Dan hasilnya akkan menjadi -10 atau angka yang sangat besar jika dalam bilangan positif oleh karena itu dengan menggunakan AND 15 kita dapat memotong bit tersebut ke jumlah bit yang kita inginkan (4 bit)
~9 = ...1111 1111 1111 0110
15 = ...0000 0000 0000 1111
-------------------------------- &
Hasilnya menjadi 0110 atau 6
Right Shift ( >> )
Operator biner yang beroperasi dengan melakukan Shift atau Geser Kanan sebanyak n kali dengan n adalah nilai yang berada setelah operator >>.
Contoh 51
51 -----> 00110011
51 >> 1 = 00011001
51 >> 3 = 00000110
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 8;
printf("Hasil dari 51 >> 1 = %d\n", (51 >> 1));
printBinary(51);
printf("\n");
printf("-------- >>\n");
printBinary(51 >> 1);
printf("\n\n");
printf("Hasil dari 51 >> 3 = %d\n", (51 >> 3));
printBinary(51);
printf("\n");
printf("-------- >>\n");
printBinary(51 >> 3);
printf("\n");
}
Left Shift ( << )
Operator biner yang beroperasi dengan melakukan Shift atau Geser Kiri sebanyak n kali dengan n adalah nilai yang berada setelah operator <<.
Contoh 51
51 -----> 00110011
51 << 1 = 01100110
51 << 3 = 10011000
#include <stdio.h>
int BIT_LENGTH;
void printBinary(unsigned int n);
int main() {
BIT_LENGTH = 8;
printf("Hasil dari 51 << 1 = %d\n", (51 << 1 & 0xFF));
printBinary(51);
printf("\n");
printf("-------- <<\n");
printBinary(51 << 1);
printf("\n\n");
printf("Hasil dari 51 << 3 = %d\n", (51 << 3 & 255));
printBinary(51);
printf("\n");
printf("-------- <<\n");
printBinary(51 << 3);
printf("\n");
/*
0xFF adalah bilangan hexadecimal yang nilainya = 255 = 1111 1111 (dalam bit) yang digunakan untuk memotong angka menjadi 8 bit
*/
}