Konverter Biner

Binary
10 1010
Octal
52
Decimal
42
Hexadecimal
2a

Komplemen dua

8-bit
0010 1010
16-bit
0000 0000 0010 1010
32-bit
0000 0000 0000 0000 0000 0000 0010 1010
64-bit
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 1010

Apa pun yang Anda masukkan di sini tidak disimpan, dicatat, atau dibagikan.

Ubah sebuah angka antara biner, oktal, desimal, dan heksadesimal, atau ubah teks menjadi biner dan sebaliknya. Nilainya tetap persis di ukuran berapa pun, termasuk jauh di atas 64 bit.

Cara memakai

  1. Pilih basis yang Anda ketik lalu masukkan nilainya.
  2. Semua basis lain ditampilkan sekaligus, dengan komplemen dua di bawahnya.
  3. Beralih ke mode Teks untuk mengubah kata menjadi biner dan sebaliknya.

Mengapa perhitungannya tepat

Setiap konversi di sini berjalan dengan BigInt, yang tidak punya batas ukuran dan tidak melakukan pembulatan. Kedengarannya seperti catatan kaki implementasi, padahal inilah pembeda utama alat ini dari kebanyakan konverter di web.

Angka JavaScript adalah double IEEE 754, dan hanya bisa menyatakan bilangan bulat secara tepat sampai 9.007.199.254.740.991, yaitu 2^53 dikurangi satu. Konverter yang ditulis dengan cara biasa akan benar di bawah angka itu dan diam-diam salah di atasnya. Ini jenis kegagalan yang buruk: tanpa error, tanpa peringatan, hanya jawaban dengan panjang dan bentuk yang benar tetapi ternyata bukan jawaban yang benar.

Ambang ini cukup rendah sehingga sering sekali terlampaui. Nilai 64-bit penuh berada jauh di atasnya. Begitu pula ID database dari generator snowflake, timestamp nanodetik, dump register perangkat keras, hash, dan apa pun yang dibaca dari alamat memori 64-bit. Jika Anda mengonversi angka yang cukup besar untuk menarik, konverter biasa justru tidak bisa diandalkan di situ.

Komplemen dua

Di bawah keempat basis, nilai ditampilkan sebagaimana disimpan dalam integer bertanda 8, 16, 32, atau 64-bit. Ini tidak sama dengan menulis tanda minus di depan digit biner, dan perbedaan itulah yang membingungkan orang saat membaca memori.

Dalam komplemen dua, bilangan negatif dibentuk dengan membalik semua bit nilai absolutnya lalu menambahkan satu. Dalam delapan bit, -1 adalah 11111111 dan -128 adalah 10000000. Tidak ada bit tanda terpisah yang bisa dilepas, tidak ada nol negatif, dan penjumlahan bekerja tanpa perlakuan khusus untuk tanda, itulah sebabnya semua prosesor arus utama menyimpan integer dengan cara ini.

Ini juga menjelaskan rentangnya yang tidak simetris. Delapan bit menampung -128 sampai 127, bukan -128 sampai 128, karena nol menempati salah satu slot di sisi positif. Lebar bit yang tidak muat untuk nilainya akan dilaporkan, bukan dipotong diam-diam, karena hasil yang terpotong tampak sepenuhnya valid padahal tidak.

Membaca output

Nilai yang panjang dikelompokkan agar mudah dibaca sekilas: biner per delapan digit (satu byte), heksadesimal per pasangan, desimal per ribuan. Pengelompokan hanya untuk tampilan dan dihapus dari apa pun yang Anda salin.

Input sengaja dibuat longgar ke arah yang sama. Prefiks 0x, 0b, dan 0o diterima lalu diabaikan, begitu pula garis bawah, spasi, dan koma yang dipakai sebagai pemisah, sehingga literal yang ditempel langsung dari kode sumber atau hex dump langsung bisa dipakai tanpa dirapikan dulu.

Teks ke biner

Mode teks meng-encode teks sebagai UTF-8 lalu menulis setiap byte sebagai delapan bit. Ke arah sebaliknya, bit dibaca kembali sebagai byte dan didekode sebagai UTF-8.

Alternatifnya - langsung mengambil code unit setiap karakter - adalah cara kebanyakan alat teks-ke-biner, dan cara itu rusak di dua tempat. Karakter di atas U+00FF menghasilkan lebih dari delapan bit dan tidak lagi sejajar dengan byte. Lebih buruk lagi, karakter di luar Basic Multilingual Plane, termasuk sebagian besar emoji, disimpan di JavaScript sebagai dua surrogate code unit; jika diperlakukan satu per satu, keduanya menjadi dua potongan tak bermakna yang tidak terdekode menjadi apa pun di sisi lain. Melewati UTF-8 menghindari kedua masalah itu, itulah sebabnya emoji bisa bolak-balik di sini sementara di tempat lain sering tidak.

Satu angka, empat cara menuliskannya

Ambil 2.025. Dalam biner angka itu 11111101001, dalam oktal 3751, dan dalam heksadesimal 7E9. Kuantitasnya sama sekali tidak berubah; yang berubah hanya basis yang dipakai menuliskannya. Digit pada basis apa pun adalah nilai tempat: 7E9 adalah 7x256 ditambah 14x16 ditambah 9, dan 11111101001 adalah jumlah pangkat-pangkat dua yang bit-nya menyala.

Heksadesimal punya tempatnya karena enam belas adalah dua pangkat empat, sehingga satu digit heksadesimal setara tepat empat bit dan pemetaannya mudah diingat: F adalah 1111, 8 adalah 1000, A adalah 1010. Itulah sebabnya dump memori, nilai warna, hash, dan alamat MAC ditulis dalam heksadesimal, bukan desimal - Anda bisa membaca bit-nya langsung dari digitnya tanpa menghitung.

Oktal bertahan terutama di satu tempat, yaitu izin file Unix, dengan alasan yang sama: tiga bit per digit cocok sempurna dengan baca, tulis, dan eksekusi, sehingga 755 berarti rwxr-xr-x dan tidak ada yang perlu dicari.

Operasi bitwise, dan untuk apa mask dipakai

Begitu sebuah nilai dilihat dalam biner, makna operator bitwise menjadi jelas. AND hanya mempertahankan bit yang menyala di kedua operan, dan itulah cara menguji sebuah flag: value AND 0b0100 bernilai bukan nol tepat ketika bit ketiga menyala. OR menyalakan bit, XOR membaliknya, NOT membalik semuanya, dan pergeseran ke kiri atau kanan mengalikan atau membagi dengan pangkat dua.

Inilah sebabnya flag disimpan sebagai bit tunggal, bukan sebagai boolean terpisah. Sebuah field izin, sekumpulan feature toggle, atau opsi pada paket jaringan bisa muat dalam satu integer, dan memeriksa salah satunya cukup satu instruksi. Konstanta yang di-AND dengan nilai itu disebut mask, dan menuliskannya dalam biner atau heksadesimal membuat tujuannya terlihat, sesuatu yang tidak pernah dicapai penulisan desimal.

Pergeseran punya satu jebakan yang perlu diketahui: di sebagian besar bahasa, pergeseran ke kanan pada nilai bertanda mempertahankan bit tanda, sehingga -8 digeser ke kanan menjadi -4, bukan bilangan positif yang besar. Bahasa yang menyediakan keduanya memakai notasi berbeda untuk yang satunya, seperti operator >>> di JavaScript.

Bagaimana sebuah angka tersimpan di memori

Nilai yang ditulis 7E9 tidak memberi tahu bagaimana ia disimpan. Lebar itu penting: angka yang sama menempati satu, dua, empat, atau delapan byte tergantung tipenya, dan nilai yang terlalu besar untuk lebarnya akan terpotong atau berputar, bukan membesar.

Urutan byte juga penting. Mesin little-endian, yang mencakup hampir semua yang Anda temui, menyimpan byte paling tidak signifikan lebih dulu, sehingga nilai 32-bit 0x000007E9 muncul di hex dump sebagai E9 07 00 00. Urutan big-endian adalah kebalikannya dan itulah yang ditetapkan protokol jaringan, karena itu disebut network byte order dan karena itu ada fungsi konversi di setiap batas socket. Membaca dump tanpa tahu Anda sedang melihat yang mana menghasilkan omong kosong yang terdengar meyakinkan.

Tipe bertanda dan tak bertanda dengan lebar yang sama menyimpan bit yang sama dan menafsirkannya berbeda: 0xFF adalah 255 sebagai byte tak bertanda dan -1 sebagai byte bertanda. Tidak ada di byte itu yang menyatakan mana yang benar; hanya tipenya yang menentukan.

Floating point adalah sistem yang sama sekali berbeda

Semua di atas menyangkut bilangan bulat. Double disimpan sebagai satu bit tanda, eksponen 11 bit, dan pecahan 52 bit, artinya ia menyatakan sebuah angka sebagai pecahan dikali pangkat dua. Nilai yang tidak bisa dinyatakan persis dengan cara itu dibulatkan ke nilai terdekat yang bisa.

Itulah penjelasan lengkap hasil terkenal bahwa 0,1 ditambah 0,2 tidak sama dengan 0,3. Sepersepuluh dalam biner adalah pecahan berulang, persis seperti sepertiga dalam desimal, jadi ia disimpan dengan sedikit selisih, dan dua nilai yang sedikit meleset dijumlahkan menghasilkan sesuatu yang sedikit meleset. Perhitungannya benar; yang salah adalah harapan bahwa pecahan desimal akan selamat melewati penyimpanan biner.

Aturan praktisnya menyusul: jangan pernah menyimpan uang dalam float, pakai sen dalam bilangan bulat atau tipe desimal; bandingkan float dengan toleransi, bukan dengan kesamaan persis; dan sadari bahwa bilangan bulat di atas 2^53 kehilangan presisi dalam double, itulah sebabnya konverter ini memakai aritmetika presisi arbitrer.

Di mana Anda menemui basis-basis ini dalam praktik

Heksadesimal muncul di mana pun byte ditampilkan kepada manusia. Warna di CSS adalah tiga byte heksadesimal; alamat MAC enam byte; digest SHA-256 tiga puluh dua byte, ditulis sebagai enam puluh empat karakter. Alamat memori, kode error sistem operasi, dan register perangkat keras juga heksadesimal karena batas bitnya sejajar dengan digitnya.

Biner muncul di tempat setiap bit punya makna: netmask, register perangkat keras, bit izin, feature flag, serta tabel encoding format seperti kode QR dan UTF-8. Membaca UTF-8 adalah contoh bagus mengapa basis itu penting - byte yang diawali 0 adalah ASCII, yang diawali 110 memulai urutan dua byte, dan yang diawali 10 adalah byte lanjutan. Struktur itu tidak terlihat dalam desimal dan jelas sekali dalam biner.

Oktal sebagian besar mundur ke izin file dan beberapa format lama, tetapi menyisakan satu jebakan yang perlu diingat: di C, di JavaScript sebelum ES5, dan di beberapa format konfigurasi, angka yang diawali nol dibaca sebagai oktal, sehingga 0755 bukan tujuh ratus lima puluh lima. JavaScript modern memakai prefiks eksplisit 0o, dan YAML 1.2 menghapus aturan nol di depan sepenuhnya, yang justru menimbulkan kejutannya sendiri ketika mode file terbaca sebagai angka desimal.

Pertanyaan umum

Apakah ini tetap akurat untuk angka yang sangat besar?
Ya. Semua aritmetikanya memakai BigInt, yang persis di ukuran berapa pun. Konverter yang dibangun di atas angka JavaScript biasa kehilangan presisi di atas 2^53, sekitar 9 kuadriliun, lalu mengembalikan jawaban yang tampak masuk akal padahal keliru. Nilai 64 bit penuh sudah melewati batas itu, jadi ini lebih sering jadi masalah daripada yang terdengar.
Apa itu komplemen dua dan kenapa ditampilkan?
Begitulah bilangan bulat bertanda sesungguhnya disimpan di memori. Dalam komplemen dua 8 bit, -1 adalah 11111111, bukan bit tanda ditambah 1. Melihat bentuk simpanannya justru itulah yang Anda butuhkan saat membaca dump register atau menelusuri masalah protokol. Lebar bit yang tidak cukup menampung nilainya akan menyatakannya, bukan memotong diam-diam.
Bisakah saya menempel nilai berawalan 0x atau 0b?
Bisa. Awalan itu diterima lalu diabaikan, begitu pula garis bawah, spasi, dan koma yang dipakai untuk pengelompokan, jadi Anda bisa menempel langsung dari kode sumber.
Bagaimana teks diubah menjadi biner?
Teksnya dikodekan sebagai UTF-8 lebih dulu, lalu setiap bita ditulis sebagai delapan bit. Artinya bahasa Jepang, Tionghoa, Korea, dan emoji tetap utuh bolak-balik. Alat yang membaca kode karakter secara langsung menghasilkan sampah untuk apa pun di luar ASCII, dan satu emoji berakhir menjadi dua potongan rusak.

Terakhir diperbarui:

Laporkan masalah

Sertakan langkah, hasil yang diharapkan, dan hasil sebenarnya. Hapus rahasia dan data pribadi.

Alat terkait