Nombor Binari di Jawa

1. Pengenalan

Sistem nombor perduaan menggunakan 0 dan 1 untuk mewakili nombor. Komputer menggunakan nombor binari untuk menyimpan dan menjalankan operasi pada sebarang data.

Dalam tutorial ini, kita akan belajar bagaimana menukar binari ke perpuluhan dan sebaliknya. Juga, kami akan melakukan penambahan dan pengurangan pada mereka.

2. Literal Perduaan

Java 7 memperkenalkan literal binari. Ini mempermudah penggunaan nombor binari.

Untuk menggunakannya, kita perlu awalan nombor dengan 0B atau 0b:

@Test public void given_binaryLiteral_thenReturnDecimalValue() { byte five = 0b101; assertEquals((byte) 5, five); short three = 0b11; assertEquals((short) 3, three); int nine = 0B1001; assertEquals(9, nine); long twentyNine = 0B11101; assertEquals(29, twentyNine); int minusThirtySeven = -0B100101; assertEquals(-37, minusThirtySeven); }

3. Penukaran Nombor Binari

Di bahagian ini, kita akan belajar bagaimana menukar nombor binari ke dalam format perpuluhan dan sebaliknya. Di sini, pertama-tama kita akan menggunakan fungsi Java bawaan untuk penukaran, dan kemudian kita akan menulis kaedah khusus untuk yang sama.

3.1. Perpuluhan hingga Nombor Perduaan

Integer mempunyai fungsi yang dinamakan toBinaryString untuk menukar nombor perpuluhan menjadi rentetan binernya :

@Test public void given_decimalNumber_then_convertToBinaryNumber() { assertEquals("1000", Integer.toBinaryString(8)); assertEquals("10100", Integer.toBinaryString(20)); }

Sekarang, kita boleh mencuba menulis logik kita sendiri untuk penukaran ini. Sebelum menulis kod, mari kita fahami terlebih dahulu cara menukar nombor perpuluhan menjadi nombor perduaan.

Untuk menukar nombor perpuluhan n ke dalam format binari, kita perlu:

  1. Bagilah n dengan 2, perhatikan q bagi dan baki r
  2. Bahagikan q dengan 2, perhatikan hasilnya dan selebihnya
  3. Ulangi langkah 2 sehingga kita mendapat 0 sebagai hasil
  4. Gabungkan dalam urutan terbalik semua baki

Mari lihat contoh menukar 6 ke dalam format binari yang setara:

  1. Pertama, bahagikan 6 dengan 2: hasil tambah 3, selebihnya 0
  2. Kemudian, bahagikan 3 dengan 2: hasil tambah 1, selebihnya 1
  3. Dan akhirnya, bahagikan 1 dengan 2: hasil tambah 0, selebihnya 1
  4. 110

Sekarang mari kita laksanakan algoritma di atas:

public Integer convertDecimalToBinary(Integer decimalNumber) { if (decimalNumber == 0) { return decimalNumber; } StringBuilder binaryNumber = new StringBuilder(); Integer quotient = decimalNumber; while (quotient > 0) { int remainder = quotient % 2; binaryNumber.append(remainder); quotient /= 2; } binaryNumber = binaryNumber.reverse(); return Integer.valueOf(binaryNumber.toString()); }

3.2. Perduaan hingga Nombor Perpuluhan

Untuk menguraikan rentetan binari, kelas Integer menyediakan fungsi parseInt :

@Test public void given_binaryNumber_then_ConvertToDecimalNumber() { assertEquals(8, Integer.parseInt("1000", 2)); assertEquals(20, Integer.parseInt("10100", 2)); }

Di sini, fungsi parseInt mengambil dua parameter sebagai input:

  1. Rentetan binari untuk ditukar
  2. Radix atau asas sistem nombor di mana rentetan input harus ditukar

Sekarang, mari kita cuba menulis logik kita sendiri untuk menukar nombor perduaan menjadi perpuluhan:

  1. Mulakan dari dengan digit paling kanan
  2. Darabkan setiap digit dengan 2 ^ {posisi} digit itu - di sini, kedudukan digit paling kanan adalah sifar dan ia meningkat ketika kita bergerak ke sebelah kiri
  3. Tambahkan hasil darab bagi mendapatkan nombor perpuluhan akhir

Sekali lagi, mari lihat kaedah kami dalam tindakan:

  1. Pertama, 101011 = (1 * 2 ^ 5) + (0 * 2 ^ 4) + (1 * 2 ^ 3) + (0 * 2 ^ 2) + (1 * 2 ^ 1) + (1 * 2 ^ 0 )
  2. Seterusnya, 101011 = (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1)
  3. Kemudian, 101011 = 32 + 0 + 8 + 0 + 2 + 1
  4. Dan akhirnya, 101011 = 43

Mari kita kodkan langkah-langkah di atas:

public Integer convertBinaryToDecimal(Integer binaryNumber) { Integer decimalNumber = 0; Integer base = 1; while (binaryNumber > 0) { int lastDigit = binaryNumber % 10; binaryNumber = binaryNumber / 10; decimalNumber += lastDigit * base; base = base * 2; } return decimalNumber; }

4. Operasi Aritmetik

Dalam bahagian ini, kita akan menumpukan perhatian pada menjalankan operasi aritmetik pada nombor binari.

4.1. Penambahan

Sama seperti penambahan nombor perpuluhan, kita mula menambahkan nombor dari digit paling kanan.

Semasa menambahkan dua digit binari, kita perlu ingat peraturan berikut:

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 1 = 10
  • 1 + 1 + 1 = 11

Peraturan ini dapat dilaksanakan seperti:

public Integer addBinaryNumber(Integer firstNum, Integer secondNum) { StringBuilder output = new StringBuilder(); int carry = 0; int temp; while (firstNum != 0 || secondNum != 0) { temp = (firstNum % 10 + secondNum % 10 + carry) % 2; output.append(temp); carry = (firstNum % 10 + secondNum % 10 + carry) / 2; firstNum = firstNum / 10; secondNum = secondNum / 10; } if (carry != 0) { output.append(carry); } return Integer.valueOf(output.reverse().toString()); }

4.2. Penolakan

Terdapat banyak cara untuk mengurangkan nombor binari. Di bahagian ini, kita akan mempelajari kaedah pelengkap seseorang untuk melakukan pengurangan.

Mari kita fahami terlebih dahulu apakah pelengkap nombor.

Pelengkap nombor adalah nombor yang diperoleh dengan menolak setiap digit nombor perduaan. Itu bermaksud ganti 1 dengan 0 dan 0 dengan 1 :

public Integer getOnesComplement(Integer num) { StringBuilder onesComplement = new StringBuilder(); while (num > 0) { int lastDigit = num % 10; if (lastDigit == 0) { onesComplement.append(1); } else { onesComplement.append(0); } num = num / 10; } return Integer.valueOf(onesComplement.reverse().toString()); }

Untuk melakukan pengurangan dua nombor binari menggunakan pelengkap seseorang, kita perlu:

  1. Mengira pelengkap seseorang daripada kinurang s
  2. Tambah s dan minuend
  3. Sekiranya pembawa dijana pada langkah 2, kemudian tambahkan hasil tersebut ke hasil langkah 2 untuk mendapatkan jawapan terakhir.
  4. Sekiranya pembawa tidak dihasilkan pada langkah 2, maka hasil pelengkap langkah 2 adalah jawapan terakhir. Tetapi dalam kes ini, jawapannya adalah negatif

Mari kita laksanakan langkah di atas:

public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) { int onesComplement = Integer.valueOf(getOnesComplement(secondNum)); StringBuilder output = new StringBuilder(); int carry = 0; int temp; while (firstNum != 0 || onesComplement != 0) { temp = (firstNum % 10 + onesComplement % 10 + carry) % 2; output.append(temp); carry = (firstNum % 10 + onesComplement % 10 + carry) / 2; firstNum = firstNum / 10; onesComplement = onesComplement / 10; } String additionOfFirstNumAndOnesComplement = output.reverse().toString(); if (carry == 1) { return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry); } else { return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement)); } }

5. Kesimpulan

Dalam artikel ini, kami belajar bagaimana menukar nombor binari menjadi nombor perpuluhan dan sebaliknya. Kemudian, kami melakukan operasi aritmetik seperti penambahan dan pengurangan nombor binari.

Kod lengkap yang digunakan dalam artikel ini terdapat di GitHub.