Metode komplemen

Dalam matematika dan komputasi, **metode komplemen** adalah teknik untuk mengkodekan rentang simetris bilangan bulat positif dan negatif dengan cara yang memungkinkan mereka menggunakan algoritma (atau mekanisme) yang sama untuk penjumlahan di seluruh rentang tersebut. Untuk sejumlah tempat tertentu, setengah dari representasi bilangan yang mungkin mewakili bilangan positif, sedangkan setengah lainnya mewakili invers aditif masing-masing. Pasangan bilangan yang merupakan invers aditif satu sama lain disebut *komplemen*. Dengan demikian, pengurangan suatu bilangan dilaksanakan dengan menambahkan komplemennya. Mengubah tanda suatu bilangan dikodekan dengan membentuk komplemennya, yang dapat dilakukan dengan algoritma yang sangat sederhana dan efisien. Metode ini dahulu umum digunakan dalam kalkulator mekanis dan masih digunakan dalam komputer modern. Konsep umum dari *komplemen basis* (seperti dijelaskan di bawah) juga berguna dalam teori bilangan, seperti pada teorema Midy.

*Komplemen sembilan* dari suatu bilangan dalam representasi desimal dibentuk dengan mengganti setiap digit dengan sembilan dikurangi digit tersebut. Untuk mengurangkan bilangan desimal *y* (pengurang) dari bilangan lain *x* (yang dikurangi) dapat digunakan dua metode:

Dalam metode pertama, komplemen sembilan dari *x* dijumlahkan dengan *y*. Kemudian komplemen sembilan dari hasil yang diperoleh dibentuk untuk menghasilkan hasil yang diinginkan.

Dalam metode kedua, komplemen sembilan dari *y* dijumlahkan dengan *x* dan satu ditambahkan ke hasilnya. Digit paling kiri ‘1’ dari hasil tersebut kemudian dibuang. Pembuangan ‘1’ paling kiri ini sangat praktis pada kalkulator atau komputer yang menggunakan jumlah digit tetap: tidak ada tempat untuk menyimpannya, sehingga secara alami hilang selama perhitungan. Komplemen sembilan yang ditambah satu dikenal sebagai *komplemen sepuluh*.

Metode komplemen dapat diperluas ke basis bilangan lainnya (radiks); khususnya, metode ini digunakan pada sebagian besar komputer digital untuk melakukan pengurangan, merepresentasikan bilangan negatif dalam basis 2 atau aritmetika biner, dan menguji overflow dalam perhitungan.

## Komplemen numerik

**Komplemen basis** dari sebuah bilangan y yang memiliki n digit dalam sistem basis b didefinisikan sebagai b^n - y.
Dalam praktiknya, komplemen basis lebih mudah diperoleh dengan menambahkan 1 pada **komplemen basis berkurang** (diminished radix complement), yang didefinisikan sebagai \left(b^n - 1\right) - y. Meskipun tampaknya sama sulitnya untuk dihitung seperti komplemen basis, perhitungan ini sebenarnya lebih sederhana karena \left(b^n - 1\right) hanyalah digit b - 1 yang diulang sebanyak n kali. Hal ini karena:



\begin{align}
b^n - 1 &= (b - 1)(b^{n-1} + b^{n-2} + \cdots + b + 1) \\
&= (b - 1)b^{n-1} + \cdots + (b - 1)
\end{align}



(lihat juga deret geometrik). Dengan mengetahui hal ini, komplemen basis berkurang dari suatu bilangan dapat ditemukan dengan mengomplemen setiap digit terhadap b - 1, yaitu dengan mengurangkan setiap digit dalam y dari b - 1.

Pengurangan y dari x menggunakan komplemen basis berkurang dapat dilakukan sebagai berikut:
Tambahkan komplemen basis berkurang dari x ke y untuk memperoleh b^n - 1 - x + y, atau setara dengan b^n - 1 - (x - y), yang merupakan komplemen basis berkurang dari x - y. Jika kemudian diambil kembali komplemen basis berkurang dari b^n - 1 - (x - y), hasilnya adalah nilai yang diinginkan, yaitu x - y.

Sebagai alternatif, dengan menggunakan komplemen basis, x - y dapat diperoleh dengan menambahkan komplemen basis dari y ke x untuk mendapatkan x + b^n - y atau x - y + b^n. Dengan asumsi bahwa y \leq x, hasilnya akan lebih besar atau sama dengan b^n, dan menghapus angka “1” paling depan dari hasil tersebut sama artinya dengan mengurangkan b^n. Maka hasil akhirnya adalah x - y + b^n - b^n atau cukup x - y, yaitu nilai yang diinginkan.

Dalam sistem bilangan desimal, komplemen basis disebut *komplemen sepuluh* dan komplemen basis berkurang disebut *komplemen sembilan*.
Dalam sistem bilangan biner, komplemen basis disebut *[[komplemen dua]]* dan komplemen basis berkurang disebut *[[komplemen satu]]*. Penamaan komplemen pada basis lain bersifat serupa. Beberapa orang, terutama Donald Knuth, menyarankan penggunaan posisi apostrof untuk membedakan antara komplemen basis dan komplemen basis berkurang. Dalam penggunaan tersebut, *komplemen empat* mengacu pada komplemen basis dari bilangan berbasis empat, sedangkan *komplemen empat* mengacu pada komplemen basis berkurang dari bilangan berbasis lima. Namun, pembedaan ini tidak terlalu penting ketika basisnya sudah jelas (yang hampir selalu demikian), dan perbedaan kecil dalam penempatan apostrof ini jarang digunakan. Sebagian besar penulis menggunakan bentuk *satu* dan *komplemen sembilan*, dan banyak pedoman gaya justru menghilangkan apostrof sama sekali, merekomendasikan bentuk *komplemen satu* dan *komplemen sembilan*.

## Penggunaan praktis

Metode komplemen digunakan dalam banyak kalkulator mekanik sebagai alternatif dari memutar roda gigi ke arah berlawanan. Contohnya:

* Kalkulator Pascal memiliki dua set digit hasil, satu set hitam yang menampilkan hasil normal dan satu set merah yang menampilkan komplemen sembilan dari hasil tersebut. Sebuah bilah horizontal digunakan untuk menutup salah satu set dan menampilkan yang lain. Untuk melakukan pengurangan, digit merah ditampilkan dan diatur ke 0. Kemudian komplemen sembilan dari bilangan yang akan dikurangkan (minuend) dimasukkan. Pada beberapa mesin, hal ini bisa dilakukan dengan memutar roda dalam yang berisi angka komplemen (artinya tanpa perlu menghitung komplemen sembilan secara mental). Saat data tersebut ditampilkan di jendela komplemen (set merah), operator dapat melihat komplemen sembilan dari komplemen sembilan minuend, yaitu nilai minuend itu sendiri. Setelah itu, bilah digeser untuk menampilkan digit hitam (yang kini menampilkan komplemen sembilan dari minuend) dan bilangan pengurang (subtrahend) ditambahkan dengan memutarnya. Terakhir, operator harus menggeser bilah lagi untuk membaca hasil yang benar.
* Comptometer memiliki angka komplemen sembilan yang dicetak dalam ukuran lebih kecil di samping angka normal pada setiap tombol. Untuk melakukan pengurangan, operator diharapkan mengurangkan 1 dari bilangan pengurang secara mental, lalu memasukkan hasilnya menggunakan angka kecil tersebut. Karena mengurangkan 1 sebelum melakukan komplemen sama artinya dengan menambahkan 1 sesudahnya, operator sebenarnya sedang menambahkan komplemen sepuluh dari subtrahend. Operator juga perlu menahan "tab pemutus pengurangan" (subtraction cutoff tab) yang sesuai dengan digit paling kiri dari hasil. Tab ini mencegah carry diteruskan melewati titik itu, yaitu cara Comptometer untuk menghapus angka 1 awal dari hasil akhir.
* Kalkulator Curta juga menggunakan metode komplemen untuk pengurangan, dan cara kerjanya disembunyikan dari pengguna. Angka dimasukkan menggunakan tuas geser di sisi alat. Nilai pada setiap tuas ditambahkan ke penghitung hasil oleh mekanisme roda gigi yang terhubung dengan cam pada drum berundak berputar (echelon drum atau step drum). Drum diputar dengan engkol di bagian atas alat. Jumlah cam yang ditemui setiap digit saat engkol diputar ditentukan oleh nilai digit tersebut. Misalnya, jika tuas diatur pada posisi "6", maka ada enam cam di sekitar drum yang sesuai dengan posisi itu. Untuk pengurangan, drum digeser sedikit sebelum diputar, sehingga baris cam yang berbeda berpindah ke posisi kerja. Baris alternatif ini berisi komplemen sembilan dari digit-digitnya. Dengan demikian, baris 6 cam yang digunakan untuk penjumlahan kini diganti dengan baris berisi 3 cam. Drum yang digeser juga mengaktifkan satu cam tambahan yang menambahkan 1 ke hasil (sebagaimana disyaratkan oleh metode komplemen). Angka 1 lebih dari komplemen sepuluh yang keluar melewati digit paling signifikan pada register hasil secara efektif diabaikan.

### Dalam komputer
Penggunaan metode komplemen bersifat umum dalam komputer digital, terlepas dari representasi bilangan bertanda yang digunakan. Namun, rangkaian logika yang diperlukan bergantung pada bentuk representasinya:
* Jika digunakan representasi komplemen dua (two's complement), pengurangan hanya memerlukan pembalikan bit-bit dari bilangan pengurang dan memberi carry awal pada bit paling kanan.
* Jika digunakan representasi komplemen satu (ones' complement), diperlukan pembalikan bit-bit pengurang dan penghubungan carry keluar dari bit paling signifikan ke carry masuk bit paling tidak signifikan (end-around carry).
* Jika digunakan representasi tanda-besar (sign-magnitude), hanya bit tanda dari pengurang yang dibalik lalu dijumlahkan, tetapi logika penjumlahan atau pengurangan perlu membandingkan bit tanda, membalik salah satu masukan jika berbeda, melakukan end-around carry, dan membalik hasil jika tidak ada carry dari bit paling signifikan.

### Penggunaan manual
Metode komplemen digunakan untuk memperbaiki kesalahan ketika pembukuan akuntansi ditulis dengan tangan. Untuk menghapus suatu entri dari kolom angka, akuntan dapat menambahkan entri baru dengan komplemen sepuluh dari angka yang akan dikurangkan. Garis diletakkan di atas digit entri tersebut untuk menandai status khususnya. Dengan demikian, seluruh kolom angka dapat dijumlahkan untuk memperoleh hasil yang telah dikoreksi.

Melakukan komplemen terhadap jumlah juga berguna bagi kasir ketika memberikan uang kembalian untuk pembelian menggunakan pecahan tunggal dari pangkat bilangan dasar mata uang. Untuk mata uang desimal, itu berarti 10, 100, 1.000, dan seterusnya, misalnya uang kertas 10,00 dolar.

## Dalam pendidikan sekolah dasar

Di sekolah dasar, siswa terkadang diajarkan metode komplemen sebagai cara pintas yang berguna dalam berhitung mental. Pengurangan dilakukan dengan menambahkan komplemen sepuluh dari angka yang dikurangkan, yaitu komplemen sembilan ditambah 1. Hasil penjumlahan ini digunakan ketika jelas bahwa selisihnya akan positif, jika tidak maka komplemen sepuluh dari hasil penjumlahan digunakan dan diberi tanda negatif. Teknik yang sama juga digunakan untuk melakukan pengurangan pada mesin penjumlah.

## Lihat pula
* Curta

## Referensi