Bitwise Operation (And, Or, XoR, Shift Left, Shift Right, etc..)
Categories: Algoritma, Programming | September 15th, 2008 | by Felix J | One Comment~ (NOT) operator
Operator ini berbeda dengan operator-operator sebelumnya, karena operator ini hanya memerlukan 1 buah nilai, dan bukan dua buah nilai seperti operator2 sebelumnya. Oleh karena itu, operator seperti ini juga disebut dengan unary operator, sendangkan operator-operator sebelumnya ( &, |, ^) disebut binary operator karena memerlukan 2 buah nilai.
operator ~ (NOT) ini, membalikkan bit-bit yang ada pada variabel. maksudnya adalah smua bit 1 dirubah menjadi 0, dan smua bit 0 berubah menjadi 1.
PERLU DIINGAT !! bahwa hasil dari operator ~ (NOT) ini, sangat bergantung pada panjang bit pada variabel.
Contohnya (lsg ambil dari site felix-halim.net) :
int a = 10;
printf("%d",~a);
output dari diatas adalah -11 ! dateng darimanakah -11 itu? untuk mengetahuinya, anda juga harus tau representasi negatif angka pada binary. sekarang kita liat operasi pada compiler 16 bit (ingat, operator ini bergantung pada panjang bit variabelnya… dalam hal ini di compiler 16 bit adalah 16)
10 = 0000000000001010 (16 bits - panjangnya 16)
---------------- ~
1111111111110101 -> -11
ini benar karena komputer menyimpan -11 sebagai 1111111111110101 pada binari. tapi sekarang kita coba, untuk print menjadi unsigned number (bilangan non negatif)
int a = 10;
printf("%u",~a);
outputnya adalah 65525. dimana ini juga adalah benar… karena 65525 juga di representasikan dengan 1111111111110101. mengapa ini bs terjadi? ini karena pada kasus untuk bilangan bs negatif (int) komputer membuat rule bahwa bit paling kiri adalah “sign bit” yaitu bit yang menandakan positif ato negatif.. jika bit plg kiri itu 0, maka dia positif, jika bit plg kiri itu 1, maka negatif.
Lalu kenapa pada saat kita print menjadi unsigned (bilangan tanpa negatif) hasilnya bs 65525 ? karena bit paling kiri itu tidak di anggap sebagai “sign bit” melainkan sebuah bit lainnya yang mengakibatkan hasilnya benar 65525
!
Ok, ini di coba pada compiler 16 bit. jika dicoba pada compiler 32 bit (kbykan skrg) maka hasil yang keluar adalah -11 untuk int biasa dan 4294967285 untuk unsigned int. (32 bit, berarti panjang bitnya sampe 32
).
Sekarang apakah anda paham?
To be continued..
-Felix J
*Any comments/critics are welcome
*
numpang lewat… myu~~