Sering sekali saya bertemu dengan mahasiswa CompSci yang tidak mengerti bilangan
berbasis. Tidak mengerti bukan berarti nilai mata kuliah yang ada hubungannya dengan bilangan berbasis
menjadi anjlok (seperti Organisasi Komputer misalnya), beberapa dari mereka
bahkan ada yang cumm laude. Pemahaman mereka
mengenai bilangan berbasis cuma sekadar hafalan rumus, sangat efektif apabila
digunakan untuk sekedar mengerjakan soal ujian. Yup, saya mengetahui bahwa
budaya ‘hafalan rumus’ bukan cuma terjadi untuk bilangan berbasis, tapi untuk
mata kuliah lainnya, seperti kalkulus, probabilitas, dan sebagainya. Kealpaan
pemahaman mengenai kalkulus untuk mahasiswa CompSci
tentu saja sangat bisa ditolerir, karena jarang sekali ilmu tersebut diterapkan
di dunia IT (jarang bukan berarti tidak sama sekali). Nah, bagaimana dengan
kealpaan pemahaman mengenai bilangan berbasis? John Mauchly merancang komputer
elektronik pertama dengan memanfaatkan konsep bilangan biner. File editor
sangat umum menggunakan heksa desimal untuk mempermudah pengeditan. Intinya,
bilangan berbasis itu teman kita, jangan sampai kita tidak mengerti apa itu
bilangan berbasis.
Let’s define ‘mengerti’
Saya masih ingat pada saat masih SD dan pertama kali belajar
perkalian. Yang diajarkan pertama kali adalah perkalian satu, perkalian dua,
tiga dan sebagainya. Saya menghafal perkalian-perkalian itu sampai larut malam,
karena takut kalau keesokan harinya disuruh maju ke depan sambil melafazkan
perkalian tersebut. Kalau nggak hafal, tentu saja malu Men! Bagi saya saat itu perkalian itu cuma sekedar hafalan, hafalan
perkalian dua, hafalan perkalian tiga dan sebagainya. Pandangan saya berubah suatu
ketika saya berkunjung ke rumah tetangga dan kepala keluarga (bapaknya
maksudnya) dari tetangga saya itu mengatakan sesuatu yang mengubah hidup saya
selamanya (halah). Kata-kata itu adalah, ‘Empat kali dua itu, artinya adalah
empatnya ada dua kali, jadi empat ditambah empat, hasilnya tentu saja delapan’.
Saya waktu itu yang selalu menganggap bahwa perkalian itu adalah hafalan, tanpa
ada makna tertentu dibaliknya, dibuat tercengang oleh kata-kata yang mungkin
anak TK aja udah tau! Akhirnya saya sadar, bahwa dalam belajar matematika, rumus itu nggak penting! Yang penting itu
konsep!
Nah sekarang, orang yang ngerti perkalian itu yang mana sih?
Misal ada orang yang hafal perkalian plus skill melakukan perhitungan dengan cepat, tapi tidak tahu bahwa
lima dikali empat itu artinya adalah ‘limanya ada empat kali’ dibandingkan sama
orang yang nggak hafal perkalian, tapi tahu arti dari lima dikali empat, orang
yang mana yang dapat dianggap mengerti perkalian? Keduanya tentu saja parah,
tapi entah kenapa, saya lebih cenderung memilih orang yang kedua (yang mengerti
makna perkalian walaupun tidak hafal perkalian).
Dewasa ini, kebanyakan dari orang yang belajar sains berada
di dalam kuadran penghafal. Coba, tanya sama mahasiswa yang kalkulusnya dapat
A, limit itu apa sih? Pasti nggak tahu. Kalkulus itu kan ilmu tentang limit,
diferensial dan integral itu ujung-ujungnya limit, lha kalau limit nggak tau
kok bisa dapet A J
Di kampus saya (Binus), bahkan ada dosen senior yang nggak
ngerti konsep. Saat itu saya sedang mengambil mata kuliah Probabilitas dan Statistika.
Nah, beliau memberi soal yang menurut saya salah soal. Soalnya adalah mengenai
sebaran binomial. Saya tahu persis bagaimana rumus sebaran binomial itu
diturunkan, sehingga sebaran binomial itu cuma valid kalau peluang-peluangnya
saling lepas (kalo bingung nggak usah dipikirin J
). Pada saat kelas selesai saya menghampiri beliau dan mengatakan bahwa soal
yang tadi itu absurd. Beliau belum mau ngaku kalau soal itu salah. Waduh, udah
lama ngajar kok gini aja nggak tau!? Minggu depannya saat ketemu lagi, akhirnya
beliau mengakui kesalahannya. Salut, dosen senior yang berani mengaku salah,
suatu saat saya baru tahu bahwa beliau adalah salah satu pembesar Badan Pusat
Statistika.
Belajar bilangan berbasis itu belajar apa sih?
Tanpa disadari sebenarnya kita sudah diajarkan bilangan
berbasis sejak TK. Kita dikenalkan kepada bilangan desimal, bilangan berbasis
10. Kita diajarkan cara menghitung dari 1 sampai 1000. Anak TK yang bisa
menghitung dari 1 sampai 1000, kemungkinan juga bisa melanjutkan sampai 2000
(kalau nggak capek tentunya), karena sudah mengerti bagaimana pola dari
bilangan desimal. Bagaimana 10, kemudian kenapa menjadi 11, kemudian 12, dari
399 kok bisa jadi 400, mereka sudah mengetahui pola penambahannya. Tidak kalah
pentingnya, mereka juga sudah menyadari bahwa digit paling kanan itu bernilai
satuan, diikuti dengan digit di kirinya yang bernilai puluhan dan sebagainya.
Sampai di sini, dapat dikatakan bahwa anak TK tersebut sudah mengerti bilangan
desimal.
Orang yang sudah memahami desimal, belum tentu menyadari
bahwa ada sistem bilangan berbasis selain sepuluh. Saat saya kelas 5 SD, ada
sebuah game Nintendo yang judulnya DJ Boy, game tentang perkelahian sambil memakai
sepatu roda. Pada game tersebut ditemukan adanya Easter egg. Dengan menekan suatu kombinasi tombol yang rumit
(mirip-mirip atas, atas, bawah, a, b, a, b), akan menyebabkan nyawanya menjadi
tidak terbatas. Kenapa tidak terbatas? Karena pada indikator jumlah nyawanya,
terpampang sebuah angka yang aneh, yaitu angka 3C, dan setelah puluhan kali
mati tetap belum game over, maka dapat disimpulkan nyawanya tidak terbatas!
Benarkah tidak terbatas? Untuk mengujinya, saya sengaja masuk ke jurang (bukan
saya yang masuk ke jurang, tapi karakter di dalam game
tersebut) dan melihat indikator jumlah nyawanya. Sebelum masuk adalah 3C. Masuk
jurang, mati sehingga nyawanya berkurang menjadi 3B. 3B? WTF!? Mirip-mirip
ukuran pakaian dalam! Pola pengurangan berikutnya adalah:
3A, 39, 38, 37,36, ..., 32, 31, 30, 2F, 2E, 2D, 2C, 2B, 2A,
29, 28, ..., 21, 20, 1F, 1E, 1D, ..., 12, 11, 10, F, E, D, C, B, A, 9, 8, ...,
3, 2, 1
Bagaimana saat nyawanya 1 dan masuk ke jurang? Nyawanya
habis dan game over! Jadi anggapan bahwa
nyawanya tidak terbatas itu salah. Beberapa tahun kemudian, saya baru tahu
bahwa pola-pola kriptik di atas itu ternyata adalah bilangan heksa desimal,
bilangan berbasis 16. Orang yang memahami kenapa pola pengurangannya seperti
itu, dan menyadari bahwa dalam heksa desimal itu digit paling kanannya bernilai
satuan, diikuti digit di sebelah kirinya bernilai 16-an, di sebelah kirinya
lagi bernilai 256-an, adalah orang yang mengerti bilangan heksa desimal.
Orang yang mengerti bilangan berbasis, berarti adalah
mengetahui pola penambahan untuk sistem bilangan berbasis berapapun.
Orang yang mengerti bilangan berbasis, mengerti bahwa pola
penambahan bilangan berbasis lima adalah:
0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30,
31, 32, 33, 34, 40, 41, 42, 43, 44, 100, 101, dan seterusnya...
Orang yang mengerti bilangan berbasis, mengerti bahwa pola
penambahan bilangan berbasis 12 adalah:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 1A, 1B, 20, 21, ..., 98, 99, 9A, 9B, A0, A1, A2, ..., A9, AA, AB,
B0, B1, B2, ..., B9, BA, BB, 100, 101, dan seterusnya...
Orang yang mengerti bilangan berbasis, mengerti pola
penambahan untuk bilangan berbasis 8, 17, 20, 100, 1 milyar, 1 zillion, dan
sebagainya...
Orang yang tidak mengerti pola-pola di atas, terlepas dari
berapa nilai mata kuliah Anda untuk pelajaran yang ada hubungannya sama basis,
berarti ilmu Anda cuma hafalan :p
Apa yang biasa diajarkan dosen pada kelas-kelas CompSci?
Hal pertama yang diajarkan oleh dosen pada mahasiswa adalah
bilangan berbasis itu ada banyak, contohnya adalah:
- ·
Bilangan biner (berbasis dua)
- ·
Bilangan oktal (berbasis delapan)
- ·
Bilangan desimal (berbasis sepuluh)
- ·
Bilangan heksa desimal (berbasis enam belas)
Tentu saja, hal di atas sangat benar, tapi sekaligus menipu.
Biasanya dosen tidak menekankan bahwa ada bilangan berbasis lain selain di
atas, sehingga mahasiswa biasanya beranggapan bahwa bilangan berbasis itu ya cuma
biner, oktal, desimal, atau heksa desimal. Kenyataannya, semua bilangan cacah yang
lebih besar dari 1 itu ada bilangan basisnya, jadi ada bilangan berbasis tiga,
empat, lima, seratus, satu miliar, satu caturta, dan sebagainya.
Hal berikutnya yang diajarkan adalah bagaimana melakukan
konversi dari bilangan berbasis selain sepuluh ke bilangan berbasis 10, sebagai
contoh:
·
100101 (biner) = ... (desimal)
·
10263 (oktal) = ... (desimal)
·
2FB (heksa) = ... (desimal)
Terkait dengan soal di atas, dosen langsung memberi rumus
yang bersesuaian. Sebagai contoh adalah rumus untuk mengubah bilangan berbasis
8 ke 10:
10263 (oktal)=1∙8^4+0∙8^3+2∙8^2+6∙8^1+3∙8^0 (desimal)
Sekali lagi, tentu saja tidak ada yang salah dengan formula di atas,
yang salah adalah dosen tidak memberi tahu dari mana asal-muasal rumus
tersebut, dan tentu saja, mahasiswa yang telah terbiasa dengan budaya menghafal
rumus dengan mudahnya ‘memahami’ rumus di atas.
Berikutnya, dosen memberi bentuk soal lain yaitu bagaimana
mengubah bilangan desimal menjadi bilangan berbasis lain dengan menggunakan
metode pembagian. Lebih lanjut, bahkan dosen memberi cara paling mudah untuk
melakukan konversi biner–oktal–heksa desimal dengan melakukan penggabungan pada
beberapa digitnya. Seperti biasa, teknik penggabungan beberapa digit dalam
rangka pemudahan pengonversian tidak diberi tahu untuk pasangan bilangan
berbasis lainnya (bisa juga digunakan untuk pasangan bilangan berbasis 3-9-27,
5-25, dan sebagainya).
Apa yang salah dengan metode di atas?
Sepintas memang tidak ada yang salah dengan metode di atas,
apalagi dengan fakta bahwa sebagian besar mahasiswa dapat melewati ujian dengan
baik. Ingat tujuan utama mengetahui bilangan berbasis bukan cuma melakukan
konversi dari bilangan berbasis anu ke bilangan berbasis ono, yang paling
penting adalah mengerti arti dari bilangan berbasis itu sendiri. Saya masih
ingat bahwa pada saat saya masih kelas dua SMP terdapat materi bilangan
berbasis pada pelajaran matematika dan diberi tahu arti dari bilangan berbasis
oleh kakak saya (lagi-lagi, guru saya hanya memberi rumus). Saat itu saya
merasakan keanggunan dari matematika, betapa hebatnya matematikawan India
ditambah ditemukannya angka nol oleh orang Arab sehingga terbentuk sistem
bilangan paling bagus yang pernah ada. Bayangkan kalau bilangan berbasis tidak
ditemukan, masak kita mau menghitung pake angka Romawi? No Man! Noooo...!
Oke, metode tadi salah, lantas, apakah saya termasuk golongan yang mengerti
atau bukan?
Orang yang mengerti bilangan berbasis, dapat menjawab soal
di bawah dengan masing-masing soal kurang dari lima detik! (sebenarnya lima
detik itu kelamaan)
- ·
Dalam heksa, berapakah 7AD + 1? (ingat ya dalam
5 detik)
- ·
Bilangan berbasis satu itu ada nggak?
- ·
Kenapa manusia menggunakan bilangan berbasis 10?
Kenapa tidak berbasis 7, atau berbasis 16 sekalian biar kayak komputer?
- ·
Apa yang salah dengan bilangan berbasis 5: 784?
- ·
Dalam heksa, berapakah
o
2F + 1?
o
FF + 1?
o
2FADFABDADF + 1?
o
FFAB3F0 – 1?
- ·
Berapakah, FAB(hex) x 10(hex)? ABCDEF(hex) x 100
(hex)?
- ·
Bilangan berbasis 18 itu seperti apa sih? Coba
nyatakan lambang-lambang bilangannya!
- ·
Dalam bilangan berbasis 18, berapakah 100(18) –
1? (maksud 100(18) adalah 100 dinotasikan dalam bilangan berbasis 18)
- ·
Bilangan berbasis tak berhingga itu seperti apa
ya?
Nah pembaca yang budiman, apabila anda dapat menjawab soal
di atas dengan mudah, maka anda termasuk orang yang mengerti dan kalau
ditemukan kesalahan dalam tulisan ini, please leave a comment!
Damn, Saya tidak dapat menjawabnya, lantas Anda mau bilang kalo
saya bodoh? sialan Lu!
Tentu saja tidak! Yang membuat anda tidak mengerti bukan
karena kebodohan, tapi karena tidak ada yang memberi tahu. Untuk mengerti
konsep bilangan berbasis itu sama sekali tidak sulit, cuma butuh membaca
tulisan ini J
dan percayalah, sama sekali tidak sulit. Bahkan saya pernah ketemu sama orang
pinter yang tidak mengerti basis. Orang itu saya anggap pinter bukan karena
bisa meramal, bukan juga karena dia cantik (kenyataannya dia memang manis J ), tapi karena secara
prestasi mengagumkan. Selalu juara umum di SMU, kalau ikut simulasi UMPTN di
SSC Bandung skornya 80 persen ke atas (saya selalu 60 persenan), masuk elektro
ITB secara PMDK (berarti rapornya bagus sekali), lulus *** laude, dan menjadi
juara pada suatu lomba di Jerman saat mengambil S2 di sana. Lha kalo saya, S1 aja nggak lulus-lulus J
Sebelum ditemukan angka Arab (basis 10)
Gunakan imajinasi anda, anggap kita berada di suatu
peradaban yang sangat sederhana sehingga belum ditemukan sebuah sistem
bilangan, dan Anda disuruh oleh kepala suku untuk menciptakan sistem bilangan.
Misalkan ada sebuah jeruk, bagaimana cara menotasikan nilai
‘satu’?
Tentu saja, cara yang paling alami adalah dilambangkan
dengan garis lurus seperti ini:
I
Sehingga, untuk menotasikan nilai ‘dua’ cukup dengan
menambahkan garis lurus:
II
Demikian juga untuk menotasikan nilai-nilai berikutnya:
III (sebagai notasi dari ‘tiga buah’)
IIII ( sebagai notasi dari ‘empat buah’)
IIIII ( sebagai notasi dari ‘lima buah’)
Suatu saat, tentu saja juga dibutuhkan juga untuk menotasikan bilangan-bilangan
besar seperti seratus, dua ratus, bahkan seribu. Oke, notasinya adalah
IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII
IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII (notasi dari ‘seratus’)
IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII
IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII
IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII IIIII
IIIII (notasi dari ‘dua ratus’)
Bagaimana dengan seribu? Silahkan tulis sendiri, yang
penting anda mengerti kelemahan dari sistem bilangan yang baru kita rancang.
Sudah waktunya untuk menemukan sebuah sistem yang baru, sistem yang bisa
menotasikan bilangan besar dengan tulisan yang sedikit.
Cara yang lain segera ditemukan untuk menotasikan bilangan,
yaitu dengan menggunakan lambang bilangan, yang kira-kira seperti ini:
|
!
|
notasi dari
|
‘satu’
|
|
@
|
notasi dari
|
‘dua’
|
|
#
|
notasi dari
|
‘tiga’
|
|
$
|
notasi dari
|
’empat’
|
|
%
|
notasi dari
|
’lima’
|
|
^
|
notasi dari
|
’enam’
|
|
&
|
notasi dari
|
’tujuh’
|
|
*
|
notasi dari
|
’delapan’
|
|
(
|
notasi dari
|
’sembilan’
|
|
)
|
notasi dari
|
’sepuluh’
|
|
-
|
notasi dari
|
’sebelas’
|
|
Dan sebagainya
|
Dengan cara ini, semua bilangan dapat dinotasikan cukup
dengan sebuah lambang bilangan. Semua bilangan dinotasikan dalam sebuah lambang
artinya sebuah bilangan berapapun pasti ada lambang bilangannya, termasuk bilangan-bilangan
besar seperti ‘seratus’ maupun ‘seribu’. Bisa menotasikan ‘seratus’ berarti
dari ‘satu’ hingga ‘seratus’ ada lambang bilangannya sendiri sehingga kita
harus menghafal banyak sekali lambang bilangan. Sistem bilangan yang seperti
itu, tentu saja gagal.
Sistem bilangan yang pertama walaupun harus menulis banyak
‘garis’ untuk menotasikan bilangan besar, tapi kita cuma harus menghafal sebuah
lambang bilangan, yaitu ‘garis’. Untuk menotasikan bilangan besar dengan
menggunakan sistem bilangan yang kedua, kita cukup menggunakan satu buah
lambang bilangan (ingat semua nilai bilangan dibuat lambangnya), namun hal ini
juga sulit karena lambang bilangan yang dibuat tentu saja tak berhingga.
Kemudian, di antara kedua sistem bilangan tersebut, sistem bilangan mana yang
terbaik? Tidak ada yang baik, keduanya absurd! Harus ditemukan sistem bilangan
yang baru, sistem yang hanya terdiri dari sedikit lambang bilangan, dan bisa
menotasikan bilangan besar dengan mudah.
Sistem bilangan dengan sedikit lambang bilangan, namun dapat menotasikan bilangan
besar dengan mudah? Emang ada?
Tentu saja ada! Itulah yang disebut bilangan berbasis.
Perhatikan bilangan yang setiap hari kita gunakan, ada berapa lambang bilangan?
Ada sepuluh buah lambang bilangan, yaitu:
0 1 2 3 4 5 6 7 8 9
Cukup dengan menggunakan kesepuluh lambang bilangan
tersebut, kita dapat menotasikan bilangan berapapun! Ingat, tidak ada sebuah
lambang bilangan yang dapat menotasikan nilai ‘sepuluh’ karena lambang
bilangannya cuma sampai 9, untuk menotasikan nilai ‘sembilan’. Lantas bagaimana
cara menotasikan nilai ‘sepuluh’? Bisa, yaitu dengan menggabungkan lambang
bilangan ‘1’ dan lambang bilangan ‘0’ menjadi ‘10’. Tentu saja, angka ‘10’ itu
bukan lambang bilangan baru, karena cuma penggabungan dari lambang bilangan
yang sudah ada. Bagaimana kalau ingin menotasikan ‘lima ratus dua puluh lima’?
Ya gampang, dengan menggabungkan lambang bilangan tadi menjadi ‘525’. Tentu
saja, hal tersebut bukan hal yang baru bagi anda, kemungkinan besar hal ini
sudah diketahui semenjak TK. Saya cuma mau menunjukkan bahwa, sistem bilangan dengan sedikit lambang
bilangan dan dapat menotasikan bilangan berapapun benar-benar ada!
Sistem Bilangan Berbasis
Sekarang kita akan menciptakan bilangan yang cuma
menggunakan sedikit lambang bilangan dan dapat menotasikan bilangan berapapun. Misalkan
ada lambang bilangan seperti ini:
0 untuk menotasikan ‘kosong’
1 untuk menotasikan ‘satu’
2 untuk menotasikan ‘dua’
3 untuk menotasikan ‘tiga’
Jelas sekali untuk menotasikan antara ‘kosong’ hingga ‘tiga’
kita Cuma butuh sebuah lambang bilangan. Nah, bagaimana kalau ingin menotasikan
nilai ‘empat’? Ingat, tidak ada lambang bilangan ‘4’, yang ada adalah ‘0’, ‘1’,
‘2’, ‘3’. Hal ini sama dengan pertanyaan, bagaimana cara menotasikan nilai
‘sepuluh’ pada bilangan desimal. Pada bilangan desimal, lambang bilangannya
cuma antara ‘kosong’ hingga ‘sembilan’, dan untuk menotasikan ‘sepuluh’ adalah
dengan menggabungkan beberapa lambang bilangannya, yaitu ‘1’ dan ‘0’ menjadi
‘10’. Kembali ke pertanyaan semula, bagaimana menotasikan nilai ‘empat’ pada
sistem bilangan yang baru kita buat? Sama, yaitu ‘10’. Untuk lebih jelas mari
kita melihat pola penambahannya:
|
0
|
kosong
|
|
1
|
satu
|
|
2
|
Dua
|
|
3
|
Tiga
|
|
10
|
Empat
|
|
11
|
Lima
|
|
12
|
Enam
|
|
13
|
Tujuh
|
|
20
|
Delapan
|
|
21
|
Sembilan
|
|
22
|
Sepuluh
|
|
23
|
Sebelas
|
|
30
|
Dua belas
|
|
31
|
Tiga belas
|
|
32
|
Empat belas
|
|
33
|
Lima belas
|
Apakah anda dapat melihat polanya? Dimulai dari 0, kemudian
1, 2, 3. Lantas kenapa menjadi 10? Bayangkan sebuah odometer, yang
angka-angkanya adalah dari 0 sampai 3. Digit yang paling kanan berputar dari 0,
1, 2, kemudian 3. Setelah 3, tentu saja odometer kembali lagi ke 0, disertai
dengan penambahan (perputaran) 1 pada digit di sebelah kirinya. Hal ini
berlanjut terus sehingga polanya adalah seperti di atas. Ingat pada odometer,
digit paling kanan paling cepat berputar, diikuti dengan digit di sebelah
kirinya, dan diikuti lagi dengan digit di sebelah kirinya lagi dan seterusnya.
Apabila anda sudah mengerti dengan polanya, dapat ditebak bahwa bilangan
berikutnya setelah 33 adalah:
100
Kenapa? Dimulai dari digit paling kanan yaitu 3. 3 bertambah
satu, menjadi 0 lagi, tapi tentu saja disertai dengan penambahan satu pada
digit di sebelah kirinya yang juga 3. 3 bertambah satu, menjadi 0, dan membuat
digit di kirinya lagi (yaitu 0) bertambah 1, menjadi 1. Berikutnya adalah deret
penambahan satu dari 100:
101, 102, 103, 110, 111, 112, 113, 120, 121, 122, 123, 130,
131, 132, 133, 200,
201, 202, 203, 210, 211, 212, 213, 220, 221, 222, 223, 230, 231, 232, 233, 300,
301, 302, 303, 310, 311, 312, 313, 320, 321, 322, 323, 330, 331, 332, 333
Sampai di sini, harusnya anda sudah dapat menebak bahwa
angka berikutnya adalah : 1000.
Dengan sistem ini, berarti kita dapat menotasikan bilangan
berapapun dengan hanya tiga buah lambang bilangan. Sistem inilah yang disebut
dengan sistem bilangan berbasis tiga. Artinya adalah sebuah sistem bilangan yang memiliki tiga buah
lambang bilangan. Bilangan berbasis 6 misalnya, artinya adalah sebuah sistem
bilangan yang memiliki 6 buah lambang bilangan, dimulai dari 0, hingga 5.
Sehari-hari, kita menggunakan bilangan desimal, bilangan berbasis 10. Artinya,
bilangan desimal adalah bilangan yang memiliki 10 buah lambang bilangan, dari 0
hingga 9.
Sebagai pembanding, berikut adalah tabel dari ‘satu’ hingga
‘lima puluh’ dari berbagai bilangan berbasis:
|
Basis:
|
2 (biner)
|
4
|
7
|
8 (oktal)
|
10 (desimal)
|
|
1
|
1
|
1
|
1
|
1
|
|
10
|
2
|
2
|
2
|
2
|
|
11
|
3
|
3
|
3
|
3
|
|
100
|
10
|
4
|
4
|
4
|
|
101
|
11
|
5
|
5
|
5
|
|
110
|
12
|
6
|
6
|
6
|
|
111
|
13
|
10
|
7
|
7
|
|
1000
|
20
|
11
|
10
|
8
|
|
1001
|
21
|
12
|
11
|
9
|
|
1010
|
22
|
13
|
12
|
10
|
|
1011
|
23
|
14
|
13
|
11
|
|
1100
|
30
|
15
|
14
|
12
|
|
1101
|
31
|
16
|
15
|
13
|
|
1110
|
32
|
20
|
16
|
14
|
|
1111
|
33
|
21
|
17
|
15
|
|
10000
|
100
|
22
|
20
|
16
|
|
10001
|
101
|
23
|
21
|
17
|
|
10010
|
102
|
24
|
22
|
18
|
|
10011
|
103
|
25
|
23
|
19
|
|
10100
|
110
|
26
|
24
|
20
|
|
10101
|
111
|
30
|
25
|
21
|
|
10110
|
112
|
31
|
26
|
22
|
|
10111
|
113
|
32
|
27
|
23
|
|
11000
|
120
|
33
|
30
|
24
|
|
11001
|
121
|
34
|
31
|
25
|
|
11010
|
122
|
35
|
32
|
26
|
|
11011
|
123
|
36
|
33
|
27
|
|
11100
|
130
|
40
|
34
|
28
|
|
11101
|
131
|
41
|
35
|
29
|
|
11110
|
132
|
42
|
36
|
30
|
|
11111
|
133
|
43
|
37
|
31
|
|
100000
|
200
|
44
|
40
|
32
|
|
100001
|
201
|
45
|
41
|
33
|
|
100010
|
202
|
46
|
42
|
34
|
|
100011
|
203
|
50
|
43
|
35
|
|
100100
|
210
|
51
|
44
|
36
|
|
100101
|
211
|
52
|
45
|
37
|
|
100110
|
212
|
53
|
46
|
38
|
|
100111
|
213
|
54
|
47
|
39
|
|
101000
|
220
|
55
|
50
|
40
|
|
101001
|
221
|
56
|
51
|
41
|
|
101010
|
222
|
60
|
52
|
42
|
|
101011
|
223
|
61
|
53
|
43
|
|
101100
|
230
|
62
|
54
|
44
|
|
101101
|
231
|
63
|
55
|
45
|
|
101110
|
232
|
64
|
56
|
46
|
|
101111
|
233
|
65
|
57
|
47
|
|
110000
|
300
|
66
|
60
|
48
|
|
110001
|
301
|
100
|
61
|
49
|
|
110010
|
302
|
101
|
62
|
50
|
Wow, I can see The Truth! Pola di atas sudah jelas, jadi saya sudah ngerti basis?
Sabar dulu. Saya belum memberi tahu pola pertambahan
bilangan berbasis yang lebih besar dari 10. Sekaranglah saatnya. Mari kita
tinjau bilangan berbasis 11, sebuah bilangan yang terdiri dari 11 buah lambang
bilangan. Seperti biasa, dimulai dari 0 hingga 9:
0 1 2 3 4 5 6 7 8 9
Kira-kira, bilangan seperti apa yang tampil setelah 9? Untuk
bilangan berbasis 11, nilai ‘sepuluh’ dapat dinotasikan hanya dengan sebuah
lambang bilangan. Nah, mari kita sepakati sekarang bahwa lambang bilangan yang
digunakan untuk menotasikan ‘sepuluh’ adalah A, jadi lambang-lambang bilangan
yang ada di basis 11 adalah:
0 1 2 3 4 5 6 7 8 9 A
Apakah anda dapat menebak bilangan apa yang muncul setelah
A? Kalau masih tidak dapat, coba ingat
kembali konsep odometer, dimana sekarang digit-digit pada odometer terdiri dari
11 lambang bilangan di atas. Digit paling kanan berputar dari 0, 1, ..., 9 dan
hingga A. Berputar lagi tentu saja balik lagi ke 0, disertai dengan perputaran
satu pada digit di sebelah kirinya (yang tadinya 0 berupah menjadi 1). Tentu
saja, setelah A, adalah 10, diikuti dengan:
11, 12, 13, 14, 15, 16, 17, 18, 19 ...
Angka apa setelah 19? Tentu saja 1A. Bagaimana cara mengeja
1A ini? Apakah dengan mengatakan ‘satu A’? Pertanyaan yang sama adalah
bagaimana cara mengeja 19? Apakah ‘satu sembilan’? Anak TK juga tau bahwa cara
mengeja 19 adalah ‘sembilan belas’. Kalau 19 adalah ‘sembilan belas’, maka 1A
adalah ‘A belas’. Pola penambahan berikutnya adalah:
1A, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 3A, 40, 41, ..., 97, 98, 99, 9A
Angka apa setelah 9A? A ditambah satu berarti kembali ke 0,
disertai dengan pertambahan satu dari 9 menjadi A. Jadi angka berikutnya adalah
A0. Again, bagaimana cara mengeja A0?
Dengan cara yang sama, mengejanya adalah ‘A puluh’. Pola penambahan berikutnya:
A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, 100, 101, 102,
103, 104, 005, 106, 107, 108, 109, 10A, 110, 111, dan seterusnya.
Seperti biasa, cara mengeja A7 misalnya, adalah ‘A puluh
tujuh’.
Sebagai pembanding, berikut adalah tabel dari berbagai bilangan berbasis yang
lebih besar dari 10:
|
Basis
|
10
|
14
|
16
|
18
|
20
|
|
0
|
0
|
0
|
0
|
0
|
|
1
|
1
|
1
|
1
|
1
|
|
2
|
2
|
2
|
2
|
2
|
|
3
|
3
|
3
|
3
|
3
|
|
4
|
4
|
4
|
4
|
4
|
|
5
|
5
|
5
|
5
|
5
|
|
6
|
6
|
6
|
6
|
6
|
|
7
|
7
|
7
|
7
|
7
|
|
8
|
8
|
8
|
8
|
8
|
|
9
|
9
|
9
|
9
|
9
|
|
10
|
A
|
A
|
A
|
A
|
|
11
|
B
|
B
|
B
|
B
|
|
12
|
C
|
C
|
C
|
C
|
|
13
|
D
|
D
|
D
|
D
|
|
14
|
10
|
E
|
E
|
E
|
|
15
|
11
|
F
|
F
|
F
|
|
16
|
12
|
10
|
G
|
G
|
|
17
|
13
|
11
|
H
|
H
|
|
18
|
14
|
12
|
10
|
I
|
|
19
|
15
|
13
|
11
|
J
|
|
20
|
16
|
14
|
12
|
10
|
|
21
|
17
|
15
|
13
|
11
|
|
22
|
18
|
16
|
14
|
12
|
|
23
|
19
|
17
|
15
|
13
|
|
24
|
1A
|
18
|
16
|
14
|
|
25
|
1B
|
19
|
17
|
15
|
|
26
|
1C
|
1A
|
18
|
16
|
|
27
|
1D
|
1B
|
19
|
17
|
|
28
|
20
|
1C
|
1A
|
18
|
|
29
|
21
|
1D
|
1B
|
19
|
|
30
|
22
|
1E
|
1C
|
1A
|
|
31
|
23
|
1F
|
1D
|
1B
|
|
32
|
24
|
20
|
1E
|
1C
|
|
33
|
25
|
21
|
1F
|
1D
|
|
34
|
26
|
22
|
1G
|
1E
|
|
35
|
27
|
23
|
1H
|
1F
|
|
36
|
28
|
24
|
20
|
1G
|
|
37
|
29
|
25
|
21
|
1H
|
|
38
|
2A
|
26
|
22
|
1I
|
|
39
|
2B
|
27
|
23
|
1J
|
|
40
|
2C
|
28
|
24
|
20
|
Nah, apabila anda sudah mengerti pola di atas, maka anda
telah mengerti apa itu bilangan berbasis. Mengerti bilangan berbasis, walaupun
tanpa disertai pengetahuan mengenai rumus untuk melakukan konversi dari basis
anu ke basis ino ataupun rumus-rumus lainnya. Ingat, rumus-rumus itu nggak
penting! Oke, rumus tetap penting, nah, tugas Anda berikutnya, coba cari tahu
kenapa rumusnya seperti itu J
Oke, terima kasih atas penjelasannya, apalagi sudah mau capek-capek mbuatin
tabel sama kita-kita!
Yoi, sama-sama! Tapi ada beberapa yang harus saya tambahkan
tentang kata capek. In fact, saya
sama sekali tidak capek membuat tabel di atas. Mbuatnya pake C# lho, cuma
beberapa baris. Berikut adalah source-nya, ready baked code! Just copy paste it to your favorite C# 3.0 compliance
IDE.
static class
Program
{
static string ToBase(this int number, int toBase)
{
return number < toBase ? number.AsSingleChar() :
ToBase(number / toBase, toBase) + (number % toBase).AsSingleChar();
}
static string
AsSingleChar(this int
number)
{
return number < 10 ? number.ToString() : ((char)(number + 'A'
- 10)).ToString();
}
public static void Main()
{
Console.WriteLine("Basis\t10\t14\t16\t18\t20");
for (int i = 1; i
<= 40; ++i)
Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\t{4}",
i, i.ToBase(14),
i.ToBase(16), i.ToBase(18), i.ToBase(20));
}
}
Ada beberapa orang yang
bilang, solusi di atas lambat karena menggunakan rekursif. Kalau anda termasuk
yang mengatakan bahwa solusi di atas lambat, maka anda belum mengerti konsep
yang namanya kompleksitas algoritma. Jangan terpaku sama semua yang rekursif
itu lambat. Adalah benar bahwa solusi rekursif paling lambat di antara solusi
lain yang tanpa menggunakan rekursif apabila kompleksitas algoritmanya sama,
tapi solusi di atas walaupun menggunakan rekursif (yang berarti solusi paling
lambat) tapi kompleksitasnya algoritma adalah O(b log n) dengan b
adalah basis tujuan dan n adalah bilangan yang ingin dikonversi. Kompleksitas
algoritma yang ada lognya adalah salah satu yang paling baik.
Contoh, Anda ingin merubah bilangan
2147483647 (ini bukan bilangan ngasal lho! Ini adalah bilangan 32 bit yang paling
besar) ke basis 2. Contoh ini adalah kasus terberat yang dihadapi oleh fungsi
di atas, yaitu sebuah kasus di mana harus mengkonversi bilangan yang paling besar
ke basis yang paling kecil.
Sesuai dengan rumus: b
log n = 2 log 2147483647 = 31
Artinya apa? Artinya untuk
kasus terburuk, ternyata dengan solusi di atas cuma membutuhkan 31 kali
pemanggilan secara rekursif! Sangat bisa dimaafkan, jadi jangan sekali-kali
menganggap solusi di atas lambat. Kalau Anda pernah memiliki pengalaman buruk
dengan rekursif, coba tinjau kembali kompleksitas algoritmanya. Biasanya orang
langsung memiliki pengalaman buruk dengan rekursif karena pengalaman pertama
dia berkenalan dengan rekursif adalah untuk menghitung deret fibonacci. Wajar
sekali kalau orang itu langsung ilfeel ama rekursif.
Agar lebih cepat lagi, kita
dapat mengoptimasi solusi di atas. Cara paling gampang adalah menggunakan
rekursif dengan pencatatan (recursive
with memoization) seperti ini:
struct Pair<T1,
T2>
{
public T1 First;
public T2 Second;
}
private static
readonly IDictionary<Pair<int, int>, string>
baseMemos =
new Dictionary<Pair<int, int>, string>();
static string
ToBase(this int
number, int toBase)
{
var key = new Pair<int, int> { First = number, Second = toBase };
return baseMemos.ContainsKey(key) ? baseMemos[key] :
baseMemos[key]
= number < toBase ? number.AsSingleChar() :
ToBase(number / toBase, toBase) + (number % toBase).AsSingleChar();
}
Sekarang, saya cukup yakin
dengan solusi di atas untuk dipakai dalam real world application J