Minggu, 03 Agustus 2008

Dasar:BIT Operation

Apabila anda sudah mencoba memprogram paralel Port, mungkin akan timbul pertanyaan:

1. Bagaimana membuat bit ke-3 menjadi HIGH tanpa mengganggu bit yang lainnya?
2. Bagaimana membuat bit ke-7 menjadi LOW tanpa mengganggu bit lainnya?
3. Bagaimana mengecek apakah bit ke-2 adalah HIGH?

Sebelumnya, mari kita pelajari apa yang dimaksud dengan LSB (Least Significant Bit) dan MSB (Most Significant Bit).

Kita mulai dengan ilustrasi sederhana di kehidupan sehari-hari:

Berapa jumlah penumpang kereta api Argo Gede pada hari ini”
Misal, jawabannya adalah 357 penumpang.

Kembali ke pelajaran kelas 1 SD:

357 = 3 (ratusan) + 5 (puluhan) + 7 (satuan)
= 3 *100 + 5 * 10 + 7 * 1

Betul? Betuuul.....

Sekarang, karena ada salah penyampaian informasi, angka 357 salah tulis menjadi 351 (gara2 menulisnya keburu2 jadi angka 7 disangka angka 1).

351 = 3 * 100 + 5 * 10 + 1 * 1

Error yang timbul adalah 357 – 351 = 6 penumpang....

6 penumpang... hmm.... kecil sih, anggap aja penumpang tersebut enggak jadi berangkat gara2 terlambat.

Tapi, gimana kalau yang salah nulisnya adalah angka 3, disangka angka 8, maka error yang timbul adalah 857 – 357 = 500 penumpang!

Wah, gimana nih 500 penumpang? gede banget errornya kan? padahal gara2nya sama, cuma salah nulis angka, bandingkan apabila yang salah nulisnya angka terakhir (angka 7), errornya ‘masih bisa’ ditolerir (Indonesia sih masih maklum dengan error segitu hehehe...)

Maksud dari ilustrasi diatas adalah, setiap angka memiliki bobot berbeda, tergantung posisinya, dimana angka yang paling berbobot (angka 3) disebut Most Significant (paling penting) dan angka yang paling tidak berbobot (angka 7) disebut Least Significant.

Bilangan BINER
Begitu juga dengan bilangan BINER, angka paling kanan disebut Least Significant Bit (LSB), dan angka paling kiri disebut Most Significant Bit (MSB). Dan, seperti sistem desimal, masing-masing angka memiliki bobot berbeda.

Desimal : Bobotnya adalah:ribuan (10 pangkat 3), puluhan (10 pangkat 1), jutaan (10 pangkat 6), satuan (10 pangkat 0), dst.
Biner : Bobotnya adalah 16 (2 pangkat 4), 32 (2 pangkat 5), 1 (2 pangkat 0), 2 (2 pangkat 1), dst.

Mari kita lihat contoh dibawah ini:

101 biner = 1 * (2 pangkat 2) + 0 * (2 pangkat 1) + 1 * (2 pangkat 0)
= 1 * 4 + 0 * 2 + 1 * 1
= 5 desimal

Jadi 101 biner adalah 5 desimal. Silahkan cek dengan kalkulator.

Untuk 1 BYTE, setiap bit memiliki bobot:

B7 B6 B5 B4 B3 B2 B1 B0

B7 = 2 pangkat 7 = 128
B6 = 2 pangkat 6 = 64
B5 = 2 pangkat 5 = 32
B4 = 2 pangkat 4 = 16
B3 = 2 pangkat 3 = 8
B2 = 2 pangkat 2 = 4
B1 = 2 pangkat 1 = 2
B0 = 2 pangkat 0 = 1

Urutan 128, 64, 32, 16, 8, 4, 2, 1 agar diingat karena sangat membantu dalam pembuatan software untuk sistem mikrokontroller / PC interfacing.

Ok, kita kembali ke pertanyaan awal : Bagaimana membuat bit ke 3 menjadi HIGH tanpa mengganggu bit lainnya?

Misal variable A = 58 desimal = 00111010 biner, kita ingin bit ke 2 menjadi HIGH

Caranya:
1. Kita harus tahu berapa bobot bit ke 2 = 2 pangkat 2 = 4
2. OR kan dengan angka 4

00111010 biner = 58 desimal
00000101 biner = 4 desimal
---------------------------------------- OR
00111110 biner = 62 desimal

Jadi, caranya adalah (dalam Delphi):

A:=A OR 4;

Mudah bukan?

Pertanyaan kedua : Bagaimana membuat BIT ke 7 menjadi LOW tanpa mengganggu BIT lainnya?

Caranya:
1. Bobot bit ke 7 adalah 2 pangkat 7 = 128 = 10000000 biner
2. Inversikan (NOT kan) angka tersebut = 01111111 biner = 127
3. AND kan dengan hasil inversi tersebut

Misal isi variable A adalah 10000001 biner = 129 desimal

10000001 biner = 129 desimal
01111111 biner = 127 desimal
---------------------------------------- &
00000001 biner = 1 desimal

Dalam Delphi/pascal:

A:=A AND 127;

atau:

A:=A AND (NOT 128);

Pertanyaan ketiga:Bagaimana mengecek apakah bit ke 2 itu HIGH?

Kembali ke metoda masking, caranya di-AND kan dengan bobot bit ke 2 = 2 pangkat 2 = 4. Apabila hasilnya tidak sama dengan 0, maka bit tersebut HIGH.

if (A AND 4)<>0 then [bitnya HIGH....]

Geser Kiri (SHIFT LEFT)

Dalam Delphi, ada juga operator SHL dan SHR, fungsinya adalah untuk menggeser bit sejumlah x kali. Contohnya:

3 shl 2 : hasilnya?

00000011 biner shl 2 = 00001100 (biner) = 12 (desimal)

1 shl 0 = 1
1 shl 1 = 2
1 shl 2 = 4
1 shl 3 = 8
1 shl 4 = 16

Jadi, jawaban dari 3 pertanyaan di awal bisa juga:

A:=A OR 4 bisa juga A:=A OR (1 SHL 2);
A:=A AND (NOT 128); bisa juga A:=A AND (NOT (1 SHL 7));
if (A AND 4)<>0 then .. bisa juga if (A AND (1 SHL 2))<>0 then ...........

Dalam C/C++

a=a | (1 << 2); atau a|=(1<<2);
a=a & (! (1 << 7); atau a&=~(1 << 7);
if ((a & (1 << 2))) .....

Pemahaman operasi bit ini sangat berguna apabila anda ingin mendalami bidang mikrokontroller/PC interfacing... Trust me!

Tidak ada komentar: