OPERATOR PADA PEMROGRAMAN JAVA 6s4as3da3
Operator
Operator digunakan untuk mengubah nilai variabel, operator inilah yang menentukan bagaimana aplikasi memanipulasi data. Di bab operator ini tidak akan terlalu banyak penjelasan, hanya sekedar referensi untuk mengetahui bagaimana operator digunakan dalam Java. Jenis operator sendiri tidak terlalu berbeda dengan bahasa pemrograman yang lain. Berbeda dengan C++ yang dapat mengoverload operator, di Java operator tidak dapat dioverload.
Operator Assignment
Operator Assignment menggunakan simbol sama dengan (=), kita sudah melihat bagaimana operator ini digunakan di bab-bab sebelumnya. Operator ini mempunyai dua buah operand, sebelah kiri sama dengan dan sebelah kanan sama dengan. Operand sebelah kiri harus berupa variabel, sedangkan sebelah kanan bisa berupa nilai literal atau variabel yang lain. Arah operasinya adalah dari kanan ke kiri, artinya nilai sebelah kanan akan dicopy ke sebelah kiri. Setelah operasi sukses dilakukan nilai variabel di sebelah kiri akan sama dengan nilai operand di sebelah kanan.
Ada beberapa hal yang harus diperhatikan dalam menggunakan operator assignment ini,
antara lain:
Jika tipe data variabel adalah primitif, ukuran data sangat berpengaruh terhadap hasil operasi. Pastikan anda mengetahui proses casting secara implisit atau explisit, kalau proses casting terjadi secara eksplisit pastikan bahwa nilai datanya berada dalam rentang nilai variabel di sebelah kiri, karena casting secara eksplisit akan memotong data sesuai ukuran variabel di sebelah kiri.
Ingat bahwa tipe data reference bukan merupakan object, tetapi alamat dimana object sebenarnya berada. Ketika kita melakukan assigment ke variabel dengan tipe data reference, yang terjadi adalah proses pengcopyan alamat object dari operand di sebelah kanan ke operand di sebelah kiri, sedangkan objectnya sendiri tetap satu, setelah operasi selesai maka kedua operand akan merujuk ke alamat object yang sama. Kalau anda sudah belajar C/C++ konsep ini disebut dengan pointer, tetapi jangan salah, di java konsep pointer tidak dikenal, yang dikenal adalah konsep reference.
Ketika mengassign nilai ke variabel dengan tipe data reference, perlu diingat aturan tentang supertypes, subtypes dan arrays. Ketiga konsep itu akan dibahas lebih lanjut ketika kita belajar tentang konsep OOP di java di bab selanjutnya. Operator assigment bisa digabungkan dengan operator lain menghasilkan operator campuran, misalnya +=, -=, *= dan /=, operator campuran ini digunakan untuk menyingkat penulisan
kode, contohnya kode di bawah ini :
x = x + 100;
x = x – 1;
y = y * 3;
y = y / 10;
bisa disingkat menggunakan operator campuran menjadi :
x += 100;
x -= 1;
y *= 3;
y /= 10;
Sebenarnya operator campuran ada sebelas (11) buah, tetapi hanya empat di atas saja yang
sering digunakan.
Operator Relasi
Operator relasi selalu menghasilkan data boolean (true atau false), operator ini sering digunakan untuk mengecek sebuah kondisi dan diletakkan di dalam percabangan (if). Operator relasi ada
enam jenis, antara lain :
• < lebih kecil
• > lebih besar
• <= lebih kecil sama dengan
• >= lebih besar sama dengan
• == perbandingan
• != tidak sebanding
Contoh penggunaan operator relasi :
int x = 300;
if (x > 100){
//lakukan sesuatu
}
Hasil dari operasi relasi bisa diassign ke variabel dengan tipe boolean, misalnya :
int x = 300;
boolean b = x < 10;
Operator >, <, >= dan <= bisa digunakan untuk membandingkan semua tipe data bilangan bulat, bilangan pecahan dan karakter (char), baik dalam bentuk variabel ataupun dalam bentuk literal. Sedangkan operator perbandingan (== dan !=) bisa digunakan untuk mengoperasikan semua tipe data, dari primitif, wrapper class hingga tipe data reference.
Operator perbandingan cukup intuitif jika digunakan untuk membandingkan nilai data dengan tipe primitif, yang perlu diwaspadai adalah membandingkan dua buah variabel dengan tipe data pecahan, hal ini dikarenakan tipe data pecahan double atau float tidak bisa dikendalikan nilai di belakang koma, sehingga terkadang kita harus berkompromi dengan hanya membandingkan hanya sampai sekian angka di belakang koma saja.
Operator perbandingan menjadi cukup kompleks kalau digunakan untuk membandingkan nilai dari tipe data reference. Dua buah data dengan tipe data reference disebut sebanding jika keduanya memiliki alamat yang sama, atau bisa juga diartikan keduanya menunjuk ke object yang sama di dalam memory. Hati-hati menggunakan operator perbandingan terhadap tipe data
wrapper class, karena hasilnya bisa diluar dugaan. Mari kita lihat kode di bawah ini :
public class CompareWrapperClass {
public static void main(String[] args){
Integer i = new Integer(10);
Integer x = new Integer(10);
System.out.println("new Integer(10) == new Integer(10)?" + (i==x));
}
}
Tebak apa hasilnya? Ya, kalau kita compile class di atas dan dijalankan kodenya akan
menghasilkan output :
$ javac CompareWrapperClass.java
$ java CompareWrapperClass
new Integer(10) == new Integer(10)?false
$
Kalau kita modifkasi sedikit kode di atas seperti di bawah ini,
public class CompareWrapperClass {
public static void main(String[] args){
Integer i = 10;
Integer x = 10;
System.out.println("10 == 10?" + (i==x));
}
}
Ternyata hasilnya adalah sebagai berikut :
$ javac CompareWrapperClass.java
$ java CompareWrapperClass
10 == 10?true
$
Apakah anda terkejut? Perhatikan di kode pertama, variabel i dan x diassign dengan sebuah object baru menggunakan keyword new, artinya antara variabel i dan x akan menunjuk ke dua buah object Integer yang berbeda di memory, walaupun sebenarnya nilai kedua object tersebut adalah sama: 10. Sedangkan kode ke-dua, variabel i dan x diassign dengan nilai literal 10, kode ini menggunakan feature autoboxing/unboxing dari java 5 untuk mengassign nilai literal 10 ke dalam wrapper class, sehingga kedua object ini sama-sama menunjuk ke nilai yang sama, yaitu literal 10. Anda harus benar-benar jeli untuk menggunakan operator perbandingan ini kalau tipe datanya reference atau wrapper class. Gunakan method equals yang ada di wrapper class atau di tipe data reference untuk membandingkan apakah kedua data mempunyai kesamaan secara logika, karena operator perbandingan sebenarnya membandingkan alamat memory bukan membandingkan apakah kedua object secara logika sama atau tidak. Kita akan membahas topik “object equality” lebih lanjut di bab OOP tentang method equals dan hashCode, jadi kalau sekarang masih belum terlalu ngeh tentang topik ini, masih ada satu sesi lagi yang akan membahas lebih dalam di bab selanjutnya.
Operator Instanceof
Operator instanceof hanya dapat digunakan untuk mengoperasikan dua buah tipe data reference. Operator ini digunakan untuk mengecek tipe dari sebuah variabel, berikut ini contohnya :
String s = "ini string";
if(s instanceof String){
//lakukan sesuatu di sini
}
Long l = 10l;
Number x = l;
if(x instanceof Long){
//lakukan sesuatu di sini
}
Operator instanceof dapat menyebabkan error ketika kompilasi kalau tipe data variabel reference tersebut tidak berhubungan. Misalnya kita mempunyai tipe data Integer tetapi dioperasikan dengan class String seperti di bawah ini :
Integer i = 10;
if(i intanceof String){
//menyebabkan error pada waktu kompilasi
//lakukan sesuatu di sini
}
Operator instanceof biasanya digunakan sebelum melakukan downcast dari subtype ke supertype agar tidak terjadi ClassCastException. Lebih lanjut mengenai topik ini akan kita bahas dalam bab OOP di java, karena perlu mengetahui konsep inheritance sebelum bisa memahami apa itu subtype dan supertype.
Operator Aritmatik
Operator aritmatik pasti sudah sangat familiar, karena operator ini tidak jauh berbeda dengan operator aritmatik yang ada di pelajaran matematika. Simbol yang digunakan dalam java adalah :
+ penambahan
- pengurangan
* perkalian
/ pembagian
Penggunaan keempat operator di atas sangat standard, sama persis seperti di pelajaran matematika, misalnya :
int x = 10 + 100;
int y = 100 – 7;
int z = 100 * 5;
int a = 100 / 2;
Java juga mengenal operator modulus (%) atau biasa dikenal sebagai pembagi sisa. Misalnya 10 % 5 hasilnya adalah 0 (10 dibagi 5 sisa 0), atau 10 % 3 hasilnya adalah 1 (10 dibagi 3 sisa 1).
Contohnya sebagai berikut :
int x = 100 % 17;
Operator + (plus) selain digunakan sebagai penambahan juga digunakan sebagai penggabungan
String (String concatenation). Contohnya :
String s = "ini " + " String";
String concatenation menjadi sedikit kompleks kalau dirangkai dengan angka, contohnya:
String s = "ini " + " String";
int a = 10;
long b = 100;
System.out.println(s + a + b);
Ketika salah satu operand bertipe String, maka seluruh operasi + akan menjadi String concatenation, variabel a dan b juga dianggap sebagi String, output dari kode di atas adalah :
ini String10100
Kalau kita ingin menjumlahkan variabel a dan b terlebih dahulu sebelum digabungkan dengan String s, maka kita bisa meletakkan kurung di antara variabel a dan b, seperti kode di bawah ini :
String s = "ini " + " String";
int a = 10;
long b = 100;
System.out.println(s + (a + b));
Hasil kode di atas adalah :
ini String110
Java, seperti halnya C/C++ juga mengenal operator increment dan decrement :
++ increment (postfx dan prefx)
-- decrement (postfx dan prefx)
Kedua operator ini disebut juga unary operator karena hanya membutuhkan satu operand saja, sedikit berbeda dengan operator aritmatik lain yang membutuhkan dua buah operand. Operator increment akan menaikkan nilai dari operand sebesar satu satuan, sedangkan decrement akan menurunkan nilai dari operand sebanyak satu satuan. Kedua operator ini adalah bentuk lebih pendek lagi dari operator gabungan (+= dan -=). Berikut ini contoh bentuk paling panjang hingga paling pendek :
int x = 10;
x = x + 1;
//bentuk paling panjang
x += 1;
//menggunakan operator gabungan +=
x++;
//menggunakan operator increment
int y = 100;
y = y - 1;
//bentuk paling panjang
y -= 1;
//menggunakan operator gabungan -=
y--;
//menggunakan operator decrement
Operator increment dan decrement bisa diletakkan setelah operand (postfx) maupun sebelum operand (prefx), kedua bentuk ini sama-sama menaikkan atau menurunkan nilai operand sebanyak satu satuan, tetapi evaluasi terhadap operasinya mempunyai nilai berbeda. Hasil evaluasi operator increment yang diletakkan setelah operand sama dengan nilai operand sebelum dievaluasi, sedangkan hasil evaluasi operator increment yang diletakkan sebelum operand adalah lebih banyak satu satuan daripada nilai operan sebelum dievaluasi, hmm sepertinya agak susah dimengerti ya? baiklah, mari kita lihat contoh di bawah ini agar lebih
jelas :
public class IncrementTest{
public static void main(String[] args){
int x = 10;
System.println("x++ = " + x++);
System.println("Setelah evaluasi, x = " + x);
x = 10;
System.println("++x = " + ++x);
System.println("Setelah evaluasi, x = " + x);
}
}
Kalau dicompile dan dijalankan kode di atas, hasilnya adalah sebagai berikut
$ javac IncrementTest.java
$ java IncrementTest
x++ = 10
Setelah evaluasi, x = 11
++x = 11
Setelah evaluasi, x = 11
$
Nah bisa kita lihat bahwa hasil setelah evaluasi adalah sama (11), tetapi ketika operator increment sedang dievaluasi hasilnya berbeda. Kalau postfx hasilnya masih sama dengan nilai operand, kalau prefx hasilnya lebih banyak satu satuan dibanding nilai operand. Aturan ini juga berlaku untuk operator decrement
public class DecrementTest{
public static void main(String[] args){
int x = 10;
System.println("x-- = " + x--);
System.println("Setelah evaluasi, x = " + x);
x = 10;
System.println("--x = " + --x);
System.println("Setelah evaluasi, x = " + x);
}
}
Kalau dicompile dan dijalankan kode di atas, hasilnya adalah sebagai berikut
$ javac IncrementTest.java
$ java IncrementTest
x-- = 10
Setelah evaluasi, x = 9
--x = 9
Setelah evaluasi, x = 9
$
Untuk bahan latihan, coba tebak berapa output dari kode berikut ini?
public class LatihanIncrement{
public static void main(String[] args){
int x = 10;
System.out.println(--x);
System.out.println(x++ + 21 + ++x);
}
}
tebakan saya salah :( #abaikan #gapenting.
Operator Kondisi
Operator Kondisi adalah ternary operator, artinya operator ini mempunyai tiga buah operand. Operator kondisi akan mengevaluasi suatu kondisi yang nilainya benar (true) atau salah (false), kemudian mengasign suatu nilai ke dalam variabel. Dengan kata lain, operator ini mirip dengan if tetapi bertujuan untuk mengassign nilai ke sebuah variabel berdasarkan suatu kondisi. Operator kondisi menggunakan simbol ? (tanda tanya) dan : (titik dua). Contohnya sebagai berikut :
int x = 100;
String s = (x < 10) ? "kurang dari sepuluh" : "lebih dari sama dengan sepuluh"; Kode di atas artinya: kalau variabel x kurang dari sepuluh maka assign String "kurang dari sepuluh" ke dalam variabel s, sebaliknya: kalau x lebih dari sama dengan sepuluh maka assign String "lebih dari sama dengan sepuluh" ke dalam variabel s. Operator kondisi bisa dirangkai untuk lebih dari satu kondisi, misalnya kalau kondisi pertama benar assign suatu nilai ke varibel, kalau salah tes lagi kondisi kedua, kalau benar assign nilai yang lain ke variabel dan akhirnya kalau kedua kondisi juga salah assign nilai terakhir ke variabel. Struktur kodenya seperti di bawah ini :
int x = 100;
String s = (x < 10) ? "kurang dari sepuluh" : (x > 100)
? "lebih dari seratus"
: "lebih besar sama dengan sepuluh dan kurang dari sama dengan seratus";
Kode di atas artinya: kalau variabel x kurang dari sepuluh assign String "kurang dari sepuluh" ke
variabel s, selainya: kalau x lebih dari seratus assign String "lebih dari seratus" ke dalam variabel
s, kalau kedua kondisi salah: assign String "lebih besar sama dengan sepuluh dan kurang dari
sama dengan seratus" ke dalam variabel s.
Operator Bitwise
Operator bitwise digunakan untuk melakukan operasi binary terhadap variabel maupun literal dengan tipe angka. Operator bitwise dan operator bit shift (dibahas di bab berikutnya) sangat jarang digunakan dalam aplikasi berbasis database, kalau anda merasa tidak punya banyak waktu untuk belajar manipulasi bit sebaiknya segera loncat ke bab berikutnya. Kalau anda mempunyai rasa keingintahuan tinggi dan ingin melihat low level manipulasi bit, silahkan melanjutkan membaca bab ini dan bab bit shift.
Ada beberapa operator bitwise :
& (dan) membandingkan dua buah rangkaian binary dan mengembalikan nilai 1 jika keduanya bernilai 1
| (atau) membandingkan dua buah rangkaian binary dan mengembalikan nilai 1 jika keduanya
bernilai 1 atau salah satu bernilai 1
^ (xor) membandingkan dua buah rangkaian binary dan mengembalikan nilai 1 jika hanya
salah satu bernilai 1
~ negasi, merubah nilai nol menjadi satu dan sebaliknya
Mari kita lihat contoh kode untuk lebih mengerti bagaimana operator ini bekerja :
int x = 11;
int y = 13;
int z = x & y;
Setelah operasi selesai nilai variabel z adalah 9. Bagaimana cara perhitunganya? kita harus menyusun angka 11 dan 13 dalam bentuk binary, kemudian melakukan operasi & (dan) ke setiap binary di posisi yang sama, hanya kalau keduanya bernilai 1 maka hasilnya 1, sisanya 0. Perhatikan diagram di bawah ini untuk memperjelas operasi & :
1 0 1 1 => 8 + 0 + 2 + 1 = 11
1 1 0 1 => 8 + 4 + 0 + 1 = 13
_____________________________ &
1 0 0 1 => 8 + 0 + 0 + 1 = 9
Sekarang kita lihat contoh untuk operator | (atau) :
int x = 11;
int y = 13;
int z = x | y;
Setelah operasi selesai nilai variabel z adalah 15. Susun angka 11 dan 13 dalam bentuk binary, kemudian lihat susunan angka binarynya, kalau salah satu atau kedua angka binary pada posisi yang sama bernilai 1 maka hasilnya adalah 1, kalau keduanya 0 maka hasilnya 0. Perhatikan diagram di bawah ini untuk memperjelas operasi
| :
1 0 1 1 => 8 + 0 + 2 + 1 = 11
1 1 0 1 => 8 + 4 + 0 + 1 = 13
_____________________________ |
1 1 1 1 => 8 + 4 + 2 + 1 = 15
Berikutnya kita lihat contoh untuk operator ^ (xor) :
int x = 11;
int y = 13;
int z = x ^ y;
Setelah operasi selesai nilai variabel z adalah 6. Susun angka 11 dan 13 dalam bentuk binary, hanya kalau salah satu dari kedua angka binary bernilai 1 maka hasil operasinya 1, selain itu hasilnya 0. Perhatikan diagram di bawah ini untuk memperjelas operasi ^ :
1 0 1 1 => 8 + 0 + 2 + 1 = 11
1 1 0 1 => 8 + 4 + 0 + 1 = 13
_____________________________ ^
0 1 1 0 => 0 + 4 + 2 + 0 = 6
Berikutnya kita lihat contoh untuk operator ~ (negasi) :
int x = 11;
int z = ~x;
Setelah operasi selesai nilai variabel z adalah -12. Kok bisa? Sebelum kita bahas kenapa hasilnya bisa negatif, perlu kita bahas dahulu bagaimana komputer merepresentasikan bilangan negatif dan positif. Processor dan memory pada dasarnya hanya mengenal bilangan binari, angka desimal yang kita lihat juga pada dasarnya disimpan sebagai binari. Angka binari tidak mempunyai notasi negatif atau positif, untuk menandakan angka negatif atau positif dalam memory, digunakanlah teori yang disebut dengan 2's complement. Untuk mendapatkan representasi binari nilai negatif dilakukan tiga langkah, pertama ubah nilai positifnya menjadi binary, lakukan negasi dan terakhir tambahkan satu ke hasil negasi. Mari kita lihat bagaimana membuat representasi binari dari nilai negatif -11. Pertama kita buat representasi binari dari angka 11, tipe data yang dioperasikan adalah integer, maka panjang
datanya adalah 32 bit, seperti di bawah ini :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1
Setelah proses negasi, dimana nilai 0 menjadi 1 dan sebaliknya, maka representasi binarynya
menjadi :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0
Langkah terakhir dari proses 2's complement ini adalah menambahkan 1 ke binari hasil negasi,
sehingga hasil akhir representasi binari dari –11 adalah :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
Satu hal yang pasti, kalau angka digit sebelah paling kiri 0 maka angkanya pasti positif, sebaliknya jika digit paling kiri bernilai 1 maka angkanya adalah negatif. Kalua kita mendapatkan representasi binari dari sebuah angka negatif, maka untuk mengetahui berapa nilainya perlu dilakukan operasi kebalikan dari 2's complement : kurangi satu kemudian negasikan menjadi angka positifnya. Nah, kita coba kembalikan bentuk -11 di atas menjadi bentuk positifnya :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
--------------------------------------------------------------- -1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0
--------------------------------------------------------------- ~
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 => 11 positif
Kembali lagi ke operasi negasi dari integer di atas, sekarang kita bisa menjawab kenapa negasi
11 hasilnya adalah -12. Nah kita lihat Operasi berikut ini :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 => 11
--------------------------------------------------------------- ~
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0
kita kembalikan ke bentuk positifnya :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0
--------------------------------------------------------------- -1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0
--------------------------------------------------------------- ~
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 => 12
Operator Bit Shift
Selain operator bitwise yang mengoperasikan bit secara logika, ada operator bit shift yang
menggeser-geser posisi bit. Di java operator bit shift ada 3 :
• >> geser bit ke kanan secara aritmatik
• << geser bit ke kiri secara aritmatik
• >>> geser bit ke kanan secara logika
Sebenarnya ada juga konsep geser bit ke kanan secara logika, tetapi karena hasilnya sama persis dengan geser bit ke kiri secara aritmatik, tidak disediakan operatornya di Java. Untuk memperjelas bagaimana operasi geser-geser bit ini, mari kita lihat contoh di bawah ini:
int x = 11;
int y = x >> 2;
//x digeser ke kanan dua langkah
Hasilnya adalah y bernilai 2. Perhatikan diagram di bawah ini :
1 0 1 1 => 8 + 0 + 2 + 1 = 11
>> 2 geser bit di atas ke kanan dua kali dan tambahkan 0 di depan, sehingga 2 buah nilai 1 di sebelah kanan menjadi hilang, hasilnya :
0 0 1 0 => 0 + 0 + 2 + 0 = 2
Contoh berikutnya adalah geser bit ke kiri :
int x = 11;
int y = x << 2;
//x digeser ke kiri dua langkah
Hasilnya y bernilai 12. Perhatikan diagram di bawah ini :
1 0 1 1 => 8 + 0 + 2 + 1 = 11
>> 2 geser bit di atas ke kiri dua kali dan tambahkan 0 di belakang, sehingga 2 buah nilai 1 di
sebelah kanan bergeser ke kiri, hasilnya :
1 1 0 0 => 8 + 4 + 0 + 0 = 12
Bagimana kalau operasi bit shift ini dilaksanakan terhadap angka negatif? Operasi penggeseran bit menggunakan tipe data int yang mempunyai panjang 32 bit, kita sudah belajar bagaimana caranya merepresentasikan nilai negatif dalam notasi binari. Misalnya kita akan menggeser -11 ke kanan dua langkah seperti kode di bawah ini :
int x = -11;
int y = x >> 2;
//x digeser ke kiri dua langkah
Hasilnya adalah -3, kita lihat bagaimana operasi binarinya
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 => -11
--------------------------------------------------------------- << 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 => -3
Dapat dilihat di atas, bahwa pergeseran ke kanan angka negatif akan menambahkan angka 1 di sebelah kiri dan menggeser sisanya ke kanan, berbeda dengan pergeseran ke bit ke kanan pada angka positif yang menambahkan angka 0 di sebelah kiri dan menggeser sisanya ke kanan. Hal ini menyebabkan pergeseran ke kanan tidak akan merubah angka positif menjadi negatif atau sebaliknya. Pergeseran bit ke kiri untuk angka negatif dilakukan dengan menambahkan angka 0 di bit paling kanan, jadi berbeda dengan pergeseran ke kanan yang tergantung angkanya negatif atau positif, untuk pergeseran ke kiri selalu angka 0 yang ditambahkan di posisi paling kanan. Hal ini menyebabkan pergeseran ke sebelah kiri bisa mengakibatkan angka berganti tanda dari posiitif menjadi negatif atau sebaliknya, tergantung apakah setelah operasi pergeseran nilai digit paling kiri 0 (positif) atau 1 (negatif). Misalnya kita akan menggeser nilai maksumum positif integer ke kiri dua langkah seperti di
kode berikut ini :
int x = Integer.MAX_VALUE;
int y = x << 2;
//x digeser ke kiri dua langkah
Nilai y akan menjadi -4 setelah operasi di atas selesai dilaksanakan, mari kita lihat operasi
binarinya:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 => MAX_VALUE
--------------------------------------------------------------- << 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 => -4
Penggeseran bit ke kanan secara logika sedikit berbeda dengan pergeseran ke kanan secara aritmatik, hal ini terjadi karena angka yang ditambahkan di bit paling kiri selalu 0 tidak tergantung angka yang akan digeser negatif atau positif. Hasil pergeseran bit ke kanan secara logika berbeda dengan pergeseran bit ke kanan secara aritmatik kalau angka yang akan digeser bernilai negatif. Misalnya kita akan menggeser ke kanan secara logika dua langkah angka -11, seperti kode
berikut ini :
int x = -11;
int y = x >>> 2; //x digeser ke kiri dua langkah
Hasilnya adalah y bernilai 1073741821. Perhatikan diagram di bawah ini :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 => - 11
--------------------------------------------------------------- >>> 2
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 => 1073741821
Baiklah, mari kita akhiri bermain-main dengan bit, kita lanjutkan ke operator yang sangat penting
yaitu operator logika.
Operator Logika
Di kurikulum ilmu komputer, operasi logika diajarkan dalam satu semester penuh di mata kuliah
Logika Matematika, kenapa sampai satu matakuliah sendiri untuk mempelajari logika
matematika? Hal ini dikarenakan operasi logika sangat penting dalam sebuah aplikasi, membuat
rangkaian logika yang rapi dan mudah dimengerti untuk aplikasi yang rumit adalah pekerjaan
yang cukup sulit. Terkadang kita akan mendapati kode dengan banyak sekali kondisi sehingga
yang membaca kode menjadi sangat bingung bagaimana alur aplikasi berjalan.
Ada enam logical operator yang bisa digunakan dalam java :
& operator dan, di bab sebelumnya operator ini juga digunakan sebagai operator bitwise kalau operandnya bertipe angka
| operator or, di bab sebelumnya operator ini juga digunakan sebagai operator bitwise kalau operandnya bertipe angka
^ operator xor, di bab sebelumnya operator ini juga digunakan sebagai operator bitwise kalau operandnya bertipe angka
! operator logika negasi
&& operator singkat dan
|| operator singkat or
Mari kita bahas satu per satu operator di atas. Dimulai dari operator &, seperti sudah dibahas di atas, operator ini juga digunakan sebagai bitwise kalau operandnya bertipe angka. Kalau operandnya bertipe boolean maka operator & akan menghasilkan nilai true kalau kedua operand bernilai true, selainya akan menghasilkan nilai false. Perhatikan contoh kode di bawah ini :
int x = 10;
int y = 11;
boolean z = (x > 10) & (y < 100);
Variabel z akan bernilai false karena operand sebelah kiri (x > 10) bernilai false dan operand sebelah kanan (y >= 10) bernilai true. Kedua operasi di sisi kiri dan kanan akan tetap dieksekusi walaupun sudah dipastikan bahwa operand sebelah kiri bernilai false dan apapapun nilai operand di sebelah kanan tetap akan menghasilkan nilai false. Berbeda dengan operator &&, dimana operator && tidak akan mengeksekusi operand di sebelah kanan kalau sudah tahu bahwa operand sebelah kiri bernilai false. Hal inilah alasan kenapa operator && dinamakan operator singkat dan. Perilaku operator && ini penting kalau kita ingin memastikan bahwa suatu variabel object tidak bernilai null sebelum memanggil method dari
object tersebut, perhatikan contoh kode di bawah ini:
public class LogicalOperator{
public static void main(String[] args){
String nama = null;
boolean z = (nama != null) & nama.equals("ifnu");
System.out.println(z);
}
}
Kode di atas akan mengakibatkan NullPounterException karena walaupun sudah tahu bahwa operan sebelah kiri bernilai false, operand sebelah kanan tetap dieksekusi. Lihat hasil eksekusi
kode di atas :
$ javac LogicalOperator.java
$ java LogicalOperator
Exception in thread "main" java.lang.NullPointerException
at LogicalOperator.main(LogicalOperator.java:4)
$
Nah sekarang kita ubah sedikit kode di atas dengan megganti operator & menjadi operator && seperti kode di bawah ini :
public class LogicalOperator{
public static void main(String[] args){
String nama = null;
boolean z = (nama != null) && nama.equals("ifnu");
System.out.println(z);
}
}
Hasil eksekusinya akan lancar tidak mengakibatkan adanya NullPointerException.
$ javac LogicalOperator.java
$ java LogicalOperator
false
$
Operator | juga digunakan dalam operasi bitwise jika operandnya adalah angka. Jika operandnya berupa boolean, operator | akan menghasilkan nilai true kalau salah satu atau kedua operand bernilai true. Operand | hanya akan menghasilkan nilai false kalau kedua operand bernilai false. Aturan ini berlaku juga untuk operator ||, perbedaanya adalah kalau operator | kedua operand akan tetap dieksekusi walaupun operand sebelah kiri bernilai true. Padahal kalau operand di kiri bernilai true, apapun nilai operand sebelah kanan pasti hasilnya adalah true. Sedangkan untuk operator ||, kalau operand sebelah kiri bernilai true maka operand sebelah kanan tidak akan dieksekusi dan nilai true dikembalikan sebagai hasil operasinya. Silahkan edit sedikit kode di atas dan ganti operator & menjadi | untuk mengetahui bagaimana hasil evaluasi kode di atas kalau menggunakan oprator |. Operator ^ disebut opertor xor, hasil operasi xor akan bernilai true kalau nilai operand di sebelah kiri berbeda dengan operand di sebelah kanan. Misalnya operand sebelah kiri bernilai true dan sebelah kanan bernilai false atau sebaliknya. Kalau kedua operand sama sama false atau sama sama true maka hasilnya adalah false. Perhatikan contoh di bawah ini :
int x = 10;
int y = 11;
boolean z = (x > 10) ^ (y < 100);
variabel z akan bernilai true karena (x > 10) bernilai false dan (y < 100) bernilai true. Operator ! disebut sebagai inversi atau negasi, operator ini akan membalik nilai boolean true
menjadi false dan false menjadi true. Misalnya kode di bawah ini :
int x = 10;
int y = 11;
boolean z = !((x > 10) ^ (y < 100));
variabel z akan bernilai true karena operasi (x > 10) ^ (y < 100) bernilai false. Secara umum, hanya operator &&, || dan ! yang akan kita gunakan dalam contoh aplikasi di
No comments:
Post a Comment