Kepada pengunjung Yang Terhormat

Saya harap anda bahagia dengan postingan di Blog ini. anda senang,saya Melayang

Sunday, 24 January 2021

OPERATOR PADA PEMROGRAMAN JAVA 6s4as3da3

 

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

iklan popcash