Manipulasi bit bagian 3: bit shift

Di bagian ini saya akan menunjukkan apa artinya menggeser bit ke kiri dan ke kanan. Waktu saya belajar konversi biner, saya mendapati bahwa cara paling mudah bagi saya dalam konversi desimal dan biner adalah dengan membayangkan “tabel” seperti ini:

128 64 32 16 8 4 2 1

Misalnya saya ingin mengkonversi 1001 menjadi desimal, maka saya letakkan angka 1001 tersebut di bawah tabel:

128 64 32 16 8 4 2 1
        1 0 0 1

Kita lihat bit mana saja yang nilainya satu, lalu lihat angka di atas, dalam hal ini 8 dan 1, jika dijumlahkan, hasilnya adalah 9. Jadi 1001 biner = 9 desimal.

Dengan melihat tabel seperti itu, bisa kita bayangkan apa yang terjadi jika bit-bit biner semua digeser ke kiri satu posisi. Karena di geser satu posisi, maka kita menambahkan satu digit 0 di sebelah kanan, jadi 10010.

128 64 32 16 8 4 2 1
      1 0 0 1 0

Nilainya sekarang menjadi 16 + 2 = 18 atau dua kali 9. Cara lain untuk memahami ini adalah dalam desimal (basis 10), jika kita menambahkan 0 di kanan maka nilainya menjadi 10 kali lipat, misalnya 18 menjadi 180 menjadi 1800. Demikian juga dalam biner, jika kita menggeser bit ke kiri, artinya kita menambahkan digit 0 di kanan, dan nilainya menjadi dua kalinya.

Proses di atas bisa diulangi berkali-kali. Dan proses tersebut tentunya bisa dibalik, menggeser ke kanan, dalam desimal, jika kita potong satu digit terakhir, maka nilainya akan menjadi sepersepuluhnya, misalnya 180 menjadi 18. Atau tepatnya, sepersepuluh dengan pembulatan ke bawah, karena jika kita buang angka 5 dari 185 hasilnya adalah 18. Dalam notasi biner, jika kita geser ke kanan, maka nilainya akan menjadi setengahnya (juga dengan pembulatan ke bawah).

Jadi apa kegunaan bit shifting? Salah satu kegunaannya adalah untuk perkalian dan pembagian dengan dua. Kegunaan lainnya adalah untuk ekstraksi bit (mengambil bagian bit tertentu). Mengenai ekstraksi bit, akan saya bahas di bagian berikutnya.

Manipulasi bit bagian 2: operator bit

Dalam aljabar boolean kita berurusan dengan dua nilai: 0 dan 1 (atau false dan true). Dalam aljabar boolean, ada banyak operasi, tapi biasanya kita hanya peduli pada beberapa operasi dasar: AND, OR, NOT, dan XOR. Jika kita mengkonversi bilangan desimal ke dalam bentuk biner, maka kita akan mendapatkan banyak angka 0 dan 1 (tergantung berapa besar bilangannya).

Dalam operasi bit, kita akan melakukan operasi pada tiap-tiap bit pada posisi yang sama. Jadi jika kita melakukan sebuah operasi pada dua angka 8 bit A dan B, maka: ambil bit pertama dari A, operasikan dengan bit pertama di B, lalu berikutnya ambil bit kedua dari A, lalu operasikan dengan bit kedua dari B, demikian seterusnya.

Di hampir semua bahasa pemrograman, operasi bit dilakukan sekaligus pada semua bit di sebuah register atau variabel. Berikut ini definisi beberapa operator bit yang sifatnya binary (Operasi dilakukan pada posisi bit yang sama di kedua variabel atau register tersebut):

  1. AND: jika ada dua bit di posisi yang sama nilainya 1, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 AND 1 = 1, 1 AND 0 = 0, 0 AND 1 = 0, 0 AND 0 = 0).
  2. OR: jika salah satu bit atau kedua bit nilainya 1 di posisi yang sama, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 OR 1 = 1, 1 OR 0 = 1, 0 OR 1 = 1, 0 OR 0 = 0).
  3. XOR: jika dua bit di posisi yang sama nilainya berbeda, maka nilai bit di posisi tersebut menjadi 1, jika tidak maka 0 (1 XOR 1 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 0 XOR 0 = 0).

Ada juga operator unary, yaitu NOT: membalik bit 0 menjadi 1 dan sebaliknya.

Beberapa contoh:

  1. 5 desimal xor 3 desimal : 0101 xor 0011 = 0110 = 6 desimal.
  2. 5 desimal or 3 desimal : 0101 or 0011 = 0111 = 7 desimal.

Contoh lebih lengkap bisa dilihat di Wikipedia.

Mengetahui operator dasar AND sudah cukup untuk memeriksa apakah suatu bilangan sifatnya ganjil atau genap. Jika kita meng-AND-kan suatu bilangan dengan 1 dan hasilnya sama dengan 1 maka bilangan tersebut adalah ganjil, jika nol maka genap.

Di tulisan berikutnya saya akan membahas mengenai bit shift dan rotate.

Manipulasi bit bagian 1: representasi biner

Kemarin buku yang saya tunggu-tunggu akhirnya tiba juga: The Art of Computer Programming, Volumes 1-4A Boxed Set (Box Set). Dulu waktu kuliah, saya sudah membaca sebagian buku ini, tapi buku ini berat di matematika, jadi kebanyakan saya hanya membaca bagian algoritmanya saja, sambil mencoba-coba sedikit latihannya. Terinspirasi dari banyak programmer di buku Coders at work yang menyukai buku ini, dan minimal memakai buku ini sebagai referensi, maka saya sekarang berusaha membaca ulang koleksi buku Knuth, plus membaca volume yang baru: Volume 4a.

Sebagai catatan: dalam wawancara Knuth sendiri tidak menyarankan seseorang membaca buku ini dari sampul ke sampul sampai habis. Saya membaca buku ini pertama skimming dulu, mencari topik menarik, setelah itu baru saya baca teliti bagian-bagian yang saya perlukan. Jadi jika Anda merasa berat membaca buku ini: coba langsung skip ke bagian yang menarik.
Continue reading Manipulasi bit bagian 1: representasi biner

Mengenal berbagai bahasa

Anda mungkin sering membaca di berbagai buku, kalimat-kalimat semacam ini: “Prolog itu bagus untuk Artificial Intelligence”, “LISP bagus untuk AI”, “Fortran bagus untuk aplikasi numerik”, “C bagus untuk pemrograman sistem”. Tapi biasanya penulisnya tidak mendeskripsikan lebih lanjut apa maksud dari kalimat-kalimat tersebut, dan apa contohnya. Bukankah semua bahasa yang turing complete itu sama saja?. Setelah lulus dari kuliah pun, banyak yang masih belum tahu: apakah pernyataan-pernyataan tersebut benar? kalau salah, yang benar seperti apa? apa contoh aplikasi di mana memprogram dengan Lisp/Prolog/Fortan akan lebih mudah atau lebih baik dari memprogram dengan bahasa lain?

Screenshot_2016-06-11-11-19-27

Ketika orang diperkenalkan pada suatu bahasa, kebanyakan caranya adalah melalui pengenalan sintaks, lalu kemudian membuat aplikasi kecil dalam bahasa tersebut. Jika Anda belajar bahasa yang paradigmanya sama atau mirip, cara ini memang akan berhasil, tapi tidak jika paradigmanya berbeda. Saya contohkan sedikit mengenai Lisp. Kebanyakan orang akan belajar mengenai apa itu atom, apa itu list, lalu operasi terhadap atom dan list (car, cdr, cons, list, dsb). Setelah itu kebanyakan akan membuat program manipulasi list sederhana. Di titik ini sebagian orang akan bertanya: di mana bagusnya Lisp, bagian mana yang membuat ini cocok untuk aplikasi AI?
Continue reading Mengenal berbagai bahasa

Masih Ingin Banyak Belajar

Dari dulu ada banyak sekali hal-hal yang masih ingin saya pelajari yang berhubungan dengan pemrograman, ada banyak hal yang ingin saya buat. Setiap kali saya melihat sesuatu dilakukan, saya penasaran: bagaimana sih caranya teknologi itu bekerja? rasanya seperti apa sih memprogram benda seperti itu? Sekarang saya ingin menuliskan sebagin hal yang sudah saya pelajari/lakukan, dan hal-hal yang ingin saya lakukan. Sebagian ini bisa dianggap resolusi 2012.

001

Ini beberapa daftar keinginan saya dari mulai waktu jaman SMU dulu yang saya ingat saat ini yang sudah kesampaian:

  • memprogram virus polimorfik
  • membuat antivirus
  • Membuat animasi dengan assembly yang kurang dari 100 byte (waktu itu saya membuat animasi API)
  • membuat program kompresi (cuma pernah huffman, belum yang lain)
  • membuat game mode grafik (dulu pernah membuat beberapa, tidak ada yang benar-benar selesai, tapi sudah cukup puas)
  • memproses gambar (teknik dasar manipulasi piksel)
  • membuat daemon
  • memprogram Wii (porting 2 emulator)
  • membuat server HTTP, proxy server
  • mengimplementasikan beberapa enkripsi, dan setidaknya memahami berbagai jenis enkripsi (tidak pusing lagi dengan istilah stream, block, cbc, dsb)
  • menulis program dengan FORTAN (cuma untuk tugas kuliah, setelah itu pernah menulis bagaimana menghubungkan gfortran dengan DELPHI)
  • membuat aplikasi desktop dengan GUI di Windows, Linux, OS X
  • menulis sendiri shellcode untuk exploit buffer overflow
  • memprogram set top box, yang punya fitur DVD player (dengan Windows CE)
  • memprogram J2ME (pengalaman pertama memprogram mobile device dengan SL45, HP Java pertama)
  • memprogram serial port, modem, STK (Sim toolkit), SMS
  • membuat program yang berhubungan dengan SMS center
  • memprogram Palm OS, Symbian, BlackBerry
  • memprogram mesin EDC (mesin untuk swipe kartu kredit, mencetak tanda terima)
  • membaca source code Linux dan FreeBSD (serta NetBSD). Sudah berhasil memporting kernel Linux dan FreeBSD dan kodenya pernah direview oleh salah satu developer FreeBSD
  • membuat aplikasi web dengan PHP, Java, Perl, Python
  • membuat aplikasi dengan HTML5 dan ActionScript
  • memprogram microcontroller (ATMEGA, PIC, dan MSP430)
  • memprogram jam tangan (MSP430)
  • Mempelajari assembly MIPS
  • Reverse engineering berbagai program
  • Membuat shareware yang dijual
  • Menjual aplikasi BlackBerry di appworld
  • membuat program untuk update ROM handphone (Acer E130)
  • membuat parser dan translator sederhana (salah satunya adalah interpreter BASIC dalam JavaScript)

Masih ada beberapa yang ingin saya lakukan, tapi belum karena alasan ini dan itu:
Continue reading Masih Ingin Banyak Belajar

Tools untuk debugging

Di posting ini saya sekedar ingin sharing metode dan tools yang biasa saya pakai untuk debugging program. Di lingkungan yang ideal, kita seharusnya punya debugger yang canggih, cepat dan reliable, tapi sayangnya sering kali ini tidak tersedia. Ini contoh beberapa lingkungan pengembangan yang “mengesalkan” yang pernah saya jumpai:

  • Symbian versi awal (versi 6): untuk bisa mendebug, perlu IDE khusus dengan license khusus yang mahal. Symbian versi terbaru sudah semakin baik (tapi sekarang ini Symbian sudah akan berakhir).
  • BlackBerry: startup time debugger sangat lama, dan debugger sering error. Setiap kali menginstall versi program baru di BlackBerry, perlu restart (butuh sekitar 5 menit tiap kali restart).
  • Mendebug aplikasi Android di emulator. Startup emulator sangat lambat (bahkan di processor AMD quad core 3 ghz memori 16 GB) , lebih cepat mencoba langsung di HP. Masalahnya adalah ketika ada laporan: ada bug kecil di Android versi 2.2, tapi HP saya memakai Android 2.3
  • Debugging PHP di web hosting. Kadang ada masalah yang hanya muncul di web hosting, tapi tidak muncul ketika dicoba di server sendiri. Beberapa kemungkinan adalah karena versi PHP yang tidak sama, versi library yang tidak sama. Di server sendiri bisa mudah menginstall Xdebug, tapi tidak tersedia di tempat hosting.
  • Nurit Point Of Sales. Device ini banyak bugnya, tidak tersedia debugger, dan jika crash, akan memprint isi memori di atas kertas thermal sekitar 1/2 meter.
  • Kernel FreeBSD. Ketika porting tahap awal, sangat sulit mendebug apa yang terjadi di level CPU. Masalahnya karena saya tidak menggunakan development board yang memiliki JTAG.

Sebenarnya tidak semua lingkungan itu benar-benar mengesalkan jika kita punya uang, contohnya: jika saya punya uang beberapa ribu dollar, saya akan bisa mendebug Symbian dengan mudah. Jika saya punya beberapa HP Android berbagai versi, debugging Android juga lebih mudah. Jika saya punya development board resmi dengan JTAG, porting kernel akan lebih mudah. Jika saya hosting VPS dengan versi PHP saya sendiri, maka tidak akan ada masalah dengan PHP, dan andaikan ada masalah, saya bisa menginstall XDebug. Pada kenyataannya seringkali tidak tersedia dana untuk menyelesaikan berbagai masalah tersebut.
Continue reading Tools untuk debugging