Rekan kerja saya dan saya telah membengkokkan pikiran kami untuk mencari tahu mengapa ada orang yang pergi keluar dari jalan mereka untuk memprogram angka dalam basis selain basis 10.
Saya menyarankan agar Anda dapat mengoptimalkan persamaan yang lebih lama dengan meletakkan variabel di basis yang benar yang Anda kerjakan (misalnya, jika Anda hanya memiliki 5 set sesuatu tanpa sisa, Anda dapat menggunakan basis 5), tetapi saya tidak yakin jika itu benar.
Adakah pikiran?
Jawaban:
Alasan yang biasa untuk menulis angka, dalam kode, selain dari basis 10, adalah karena Anda terlalu sibuk.
Untuk memilih contoh dalam C (karena jika C baik untuk apa pun, itu baik untuk bit-twiddling), katakanlah beberapa format tingkat rendah mengkodekan angka 2-bit dan 6-bit dalam byte
xx yyyyyy
::menghasilkan
Dalam keadaan seperti itu, menulis konstanta dalam hex kurang membingungkan daripada menulisnya dalam desimal, karena satu digit hex sesuai dengan rapi untuk empat bit (setengah byte; satu 'menggigit'), dan dua hingga satu byte: angka
0x3f
memiliki semua bit atur nibble rendah, dan dua bit atur nibble tinggi.Anda juga bisa menulis baris kedua dalam oktal:
Di sini, setiap digit terkait dengan blok tiga bit. Beberapa orang menemukan itu lebih mudah untuk dipikirkan, walaupun saya pikir ini cukup langka akhir-akhir ini.
sumber
Alasan utama saya menggunakan basis yang berbeda adalah ketika saya peduli dengan bit.
Jauh lebih mudah dibaca
dari
Atau gambar sesuatu yang lebih kompleks
dibandingkan dengan
Sangat jelas di sini apa maksudnya dengan contoh hex karena hex pada dasarnya hanya bentuk biner yang lebih kompak ... Sebaliknya, basis-10 (apa yang kita gunakan) tidak memetakan hampir sama dengan biner.
Ada juga pangkalan lain yang dapat Anda gunakan dalam beberapa bahasa. Anda akan menemukan sangat sedikit penggunaan basis selain biner, hex dan desimal. Beberapa orang aneh masih menggunakan oktal, tapi itu tentang yang paling esoteris yang akan Anda lihat dalam program waras.
sumber
Seperti yang mungkin Anda ketahui, komputer didasarkan pada biner - ini adalah basis 2.
Hal ini mudah untuk mengkonversi antara basis 2 dan 4, 8 dan 16 (dan kelipatan yang sama 2), dan menjaga terjemahan ini dalam kode sumber dapat membuat bekerja dengan angka jauh lebih mudah untuk alasan tentang.
Untuk bahasa tingkat rendah seperti Majelis dan C, ini dapat menerjemahkan langsung ke operasi prosesor (misalnya, pergeseran bit untuk pembagian dan perkalian), yang berarti bahwa menggunakan basis angka ini berakhir dengan kode yang jauh lebih cepat.
Selain itu, tidak semua operasi adalah operasi numerik - ada peta bit di mana Anda perlu mengutak-atik bit secara langsung - menggunakan basis 2 atau salah satu dari beberapa untuk melakukannya sehingga membuat operasi lebih mudah.
Jika Anda ingin mempelajari lebih lanjut, saya sarankan membaca Kode oleh Charles Petzold .
sumber
Mungkin jika Anda sedang menulis permainan yang mensimulasikan ekonomi beberapa peradaban kuno yang menggunakan sistem basis 12.
sumber
Di luar program yang sangat terspesialisasi, sangat jarang menggunakan pangkalan selain 10, 16 atau 2.
Basis 16 (heksadesimal) berguna hanya karena rentang penuh byte (0-255) dapat direpresentasikan dalam dua digit (0x00-0xFF), yang dapat membuat bekerja dengan dump-hex mentah atau data biner jauh lebih mudah. Heksadesimal juga berguna ketika menggunakan bit mask dengan operator bitwise, karena dua digit untuk sebuah korespondensi byte membantu dengan keterbacaan.
Lebih jarang, basis 2 (biner) juga dapat digunakan dengan operasi bitwise, tetapi banyak bahasa pemrograman tidak mendukung basis-2 literal, dan lagi pula heksadesimal jauh lebih ringkas dan mudah dibaca.
Basis-8 (oktal) kadang-kadang juga digunakan karena izin file UNIX. Selain itu, cukup jarang menggunakan basis selain 10 di luar konteks matematika yang sangat khusus.
sumber
Alasan paling umum yang valid untuk menggunakan pangkalan lain berkaitan dengan kemudahan konversi ke pangkalan 2: itu sepele untuk mengubah nomor basis-8 atau basis-16 menjadi biner tanpa menggunakan kalkulator dengan menghafal tabel pendek delapan atau enam belas angka:
Ini membuka banyak kemungkinan:
0xFF00FF
adalah magenta (Merah + Biru); tugasnya jauh lebih sulit ketika Anda disajikan16711935
sumber
Komputer (atau lebih tepatnya kompiler) sama sekali tidak peduli apa nomor dasar yang Anda gunakan dalam kode sumber Anda. Bahasa pemrograman yang paling umum digunakan mendukung basis 8 (oktal), 10 (desimal) dan 16 (heksadesimal) secara langsung. Beberapa juga mendukung olahraga langsung untuk nomor basis 2 (biner). Bahasa khusus dapat mendukung basis nomor lain juga. (Dengan "langsung mendukung", maksud saya bahwa mereka memungkinkan masuknya angka dalam basis itu tanpa menggunakan trik matematika seperti bitshifting, perkalian, pembagian dll dalam kode sumber itu sendiri. Misalnya, C langsung mendukung basis-16 dengan
0x
angka awalan dan himpunan digit heksadesimal biasa dari 0123456789ABCDEF. Sekarang, trik semacam itu mungkin berguna untuk membuat angka lebih mudah dipahami dalam konteks, tetapi selama Anda dapat mengekspresikan nomor yang sama tanpa itu, melakukannya - atau tidak - hanya kenyamanan.)Pada akhirnya, bagaimanapun, itu tidak penting. Katakanlah Anda memiliki pernyataan seperti ini:
Tujuannya adalah untuk membuat variabel integer dan menginisialisasi dengan angka desimal 10. Apa yang dilihat komputer?
Compiler akan membatalkan ini, dan menyadari bahwa Anda mendeklarasikan variabel tipe
int
dengan naman
, dan menetapkan beberapa nilai awal. Tapi apa nilainya?Ke komputer, dan mengabaikan byte order dan masalah alignment, input untuk nilai awal variabel adalah
0x31 0x30
. Apakah ini berarti bahwa nilai awal adalah 0x3130 (12592 di basis 10)? Tentu saja tidak. Pengurai bahasa harus terus membaca file dalam pengkodean karakter yang digunakan, sehingga membaca1
0
diikuti oleh terminator pernyataan. Karena dalam bahasa ini basis 10 diasumsikan, ini dibaca (mundur) sebagai "0 yang, 1 puluhan, akhir". Artinya, nilai 10 desimal.Jika kami menetapkan nilai dalam heksadesimal, dan bahasa kami menggunakan
0x
untuk menentukan bahwa nilai berikut dalam heksadesimal, maka kami mendapatkan yang berikut:Compiler melihat
0x
(0x30 0x78) dan mengakui itu sebagai awalan base-16, jadi mencari nomor base-16 yang valid mengikutinya. Hingga terminator pernyataan, berbunyi10
. Ini diterjemahkan menjadi 0 "yang", 1 "enam belas", yang bekerja sampai 16 di basis 10. Atau 00010000 di basis 2. Atau bagaimanapun Anda ingin mewakilinya.Dalam kedua kasus, dan mengabaikan optimasi demi kesederhanaan, kompiler membagikan penyimpanan yang cukup untuk menampung nilai
int
variabel tipe, dan menempatkan di sana nilai yang dibacanya dari kode sumber menjadi semacam variabel holding sementara. Itu kemudian (kemungkinan banyak kemudian) menulis nilai-nilai biner yang dihasilkan ke file kode objek.Seperti yang Anda lihat, cara Anda menulis nilai numerik dalam kode sumber sama sekali tidak penting. Ini mungkin memiliki efek yang sangat kecil pada waktu kompilasi, tetapi saya akan membayangkan bahwa (sekali lagi, mengabaikan optimasi seperti caching disk oleh sistem operasi) hal-hal seperti turbulensi acak di sekitar piringan berputar disk, waktu akses disk, tabrakan bus data , dll., memiliki efek yang jauh lebih besar.
Intinya: jangan khawatir tentang hal itu. Tulis angka dalam basis yang didukung oleh bahasa pemrograman pilihan Anda dan yang masuk akal untuk bagaimana angka tersebut akan digunakan dan / atau dibaca. Anda menghabiskan lebih banyak waktu untuk membaca jawaban ini daripada yang pernah Anda dapat dalam waktu kompilasi dengan menjadi pandai tentang basis nomor yang digunakan dalam kode sumber. ;)
sumber
Berikut beberapa alasan yang belum muncul ...
x00 - Beberapa OS dan API perangkat keras mengharapkan argumen dalam hex / binary. Saat Anda membuat kode untuk API semacam itu, lebih mudah untuk menggunakan angka-angka dalam format yang sama seperti yang diharapkan oleh API daripada mengubahnya di antara pangkalan yang berbeda. Misalnya, untuk mengirim byte pesan ke server atau mengirim pesan untuk menutup koneksi ke saluran komunikasi.
x01 - Anda mungkin ingin aplikasi Anda mewakili karakter yang tidak tersedia di keyboard tertentu seperti tanda hak cipta (\ u00a9).
x02 - Agar konstanta / literal tetap ada (secara visual) di seluruh pengaturan budaya yang berbeda, khususnya ketika kode sumber / file dipindahkan melintasi pengembang dengan pengaturan lokal yang berbeda.
x03 - Untuk membuat kode mereka terlihat membingungkan dan kompleks - Untung C # tidak mendukung konstanta oktal!
sumber
Masalah utama adalah mewakili satu kata ukuran komputer dengan cara yang masuk akal. 6502 adalah prosesor 8 bit. 4004 adalah prosesor 4 bit.
Ketika berhadapan dengan angka 4 atau 8 bit bekerja dengan baik. Angka 4 bit adalah karakter heksadesimal tunggal. Angka 8 bit (byte) adalah dua digit hex. Sistem yang memiliki kekuatan 2 kata berukuran adalah standar yang umum dilihat saat ini - 16 bit, 32 bit, 64 bit. Semua ini dibagi 4 dengan baik untuk representasi sebagai heksadesimal.
Oktal (basis 8) digunakan dalam sistem di mana ukuran kata adalah 12, 24, atau 36. PDP8, IBM Mainframe, dan ICL 1900 hari yang lama menggunakannya. Kata-kata ini lebih mudah direpresentasikan menggunakan oktet daripada kisaran terbatas heksadesimal (ya, mereka juga dibagi menjadi 4 juga).
Ternyata ada juga penghematan biaya dengan menggunakan penomoran basis 8. Mewakili 12 bit dalam BCD, digit pertama hanya bisa 0-4 tetapi yang kedua, ketiga, dan keempat mungkin 0-9. Jika ini dilakukan sebagai hex, satu memiliki 3 karakter hex, tetapi masing-masing memiliki 16 nilai yang mungkin. Itu lebih murah untuk menghasilkan tabung nixie yang hanya memiliki 0-7 dari yang memiliki 0-9 (dengan logika tambahan untuk BCD) atau 0-F untuk heksadesimal.
Satu masih melihat oktal hari ini dengan izin file unix (755, 644) di mana pemilik, grup dan dunia masing-masing memiliki 3 bit yang mewakili izin.
Dalam dunia matematika, seseorang terkadang melakukan beberapa hal aneh dengan basis yang berbeda. Misalnya, urutan Goodstein yang lemah dari project euler 396 ... atau sesuatu yang lebih sederhana dengan angka palindrom . Ada properti dari angka dalam basis N bahwa angka yang merupakan kelipatan dari N - 1 akan memiliki jumlah digitnya hingga kelipatan dari N - 1 . Selain itu, jika N - 1 adalah kuadrat sempurna, properti ini juga ada untuk sqrt ( N - 1 ). Ini memiliki beberapa aplikasi dalam masalah matematika tertentu.
sumber
Dalam industri keuangan, ada skema pengidentifikasi yang secara efektif menjadi basis 36 . Ia menggunakan angka 0-9 dan huruf BZ untuk mewakili angka bernilai 0-35. Itu melompati vokal untuk mencegah nama-nama buruk yang dihasilkan.
Namun itu tidak sempurna. Ada suatu masa ketika satu perusahaan malang memiliki id
B000BZ
.sumber
Alasan # 1: karena semua angka pada level rangkaian direpresentasikan dalam basis-2 (sakelar listrik hidup atau mati). Alasan # 2: karena pada satu tingkat lebih tinggi dari sirkuit yang sebenarnya, bit dikelompokkan ke dalam byte, dan byte dapat dengan mudah direpresentasikan sebagai dua digit heksadesimal, ketika akan mengambil 3 digit desimal (dan beberapa validasi) untuk mewakili semua nilai yang mungkin dari byte.
Jadi, jika Anda bekerja pada level ini (atau mendekati mereka, dalam beberapa lingkungan yang dikelola), lebih mudah untuk bekerja dalam biner atau heksadesimal daripada desimal. Situasi di mana Anda akan melakukan ini bervariasi, tetapi biasanya tidak pernah situasi di mana Anda hanya perlu aritmatika dasar.
sumber
Satu area di mana angka dasar 16 (heksadesimal) digunakan sangat sering adalah dalam menentukan warna, terutama ketika menggunakan HTML / CSS untuk web. Warna yang kami gunakan pada tampilan digital ditentukan menggunakan kombinasi 3 nilai intensitas untuk 3 warna "dasar" (RGB - merah, hijau, biru) yang dicampur bersama untuk membuat 16 juta warna yang dapat ditampilkan (menggunakan warna 24-bit) ).
Misalnya, intensitas penuh hijau dalam hex akan
0x00ff00
dan65280
dalam desimal. Sekarang bayangkan mencoba untuk "secara manual" mencampur warna di kepala Anda yang memiliki bagian yang sama merah dan biru, katakan pada setengah intensitas, untuk membuat ungu yang bagus :) Dalam heks ini akan ditulis hanya sebagai0x800080
sedangkan nilai desimal untuk ini akan menjadi8388736
. Semakin mudah ketika bekerja dengan nuansa abu-abu - 50% abu-abu adalah0x808080
(hex) dan8421504
(desimal), 75% adalah0xC0C0C0
dan12632256
, dan seterusnya.Menggunakan hex jauh lebih intuitif dan siapa pun yang terbiasa dengan penggunaan warna ini akan segera dapat "menebak" warna hanya dengan melihat nilai hex. Ini juga jauh lebih sedikit kesalahan cenderung untuk digunakan jika Anda perlu menggunakan warna yang sama beberapa kali (yang biasanya terjadi).
Periksa halaman web apa saja (dan khususnya CSS) untuk penggunaan hex yang gila: D
CATATAN: Dalam CSS nilai hex ditulis menggunakan
#
awalan, misalnya:#00ff00
untuk hijau, dan kadang-kadang juga disingkat menjadi hanya tiga digit, seperti#0f0
untuk hijau.sumber
Untuk beberapa algoritma, basis 2 lebih masuk akal daripada yang lain. Misalnya, apakah Anda lebih suka menulis fungsi untuk melintasi pohon biner, atau pohon 10-ary?
Tetapi, lebih sering, basis 2 digunakan karena itulah bagaimana komputer hampir secara universal mewakili angka mereka. Ini berarti:
Juga, selalu ada aplikasi langka yang secara inheren membutuhkan basis aneh yang mungkin bukan 2 atau 10.
sumber
2
karakter aneh yang Anda gunakan ini?Ini adalah pilihan yang jujur, jika karena alasan tertentu Anda memiliki polydactyly dan memiliki 11 jari atau suka menghitung dengan jari-jari kaki Anda sehingga Anda suka bekerja di base 20 itu jujur terserah Anda. Tetapi sadari bahwa pada topik universalitas bahwa kebanyakan dari kita yang harus berurusan dengan bit dan byte setiap hari akan benar-benar tergerak jika kita mendapatkan sesuatu yang melakukan manipulasi bit pada basis 19.
ALASAN UNTUK DASAR x
Base 10 - Model semua barang kami karena kami punya 10 digit penghitungan (kaki aneh dan bau jadi kami tidak menggunakannya).
Basis 2 - Komputer menggunakan ini untuk bit (on / off) ini terkait dengan level tegangan yang dapat dibaca yang diperbanyak oleh gerbang / transistor / kapasitor.
Basis 8 - Tua, dulu ketika komputer tidak super besar (atau kembali ketika mereka ruang bijaksana) ini bagus untuk sesuatu atau yang lain (saya tidak suka sedikit pun)
Basis 16 - Baik untuk menunjukkan gigitan byte atas dan bawah untuk manipulasi bit. Ini sangat berguna di dunia embedded / fpga / hardware.
DASAR KOMPUTER NORMAL
Untuk memilih preferensi, saya bisa memberi tahu Anda dengan tepat bagaimana "on" warna dalam nilai hex RGB yang diberikan kepada saya, ini akibatnya dapat direpresentasikan dalam satu int dalam perangkat keras dan kemudian dengan beberapa shift dapat diberikan kembali kepada saya mudah-peasy, 1 warna kompleks = 1 titik data yang bagus untuk pemrosesan gambar besar dengan memori terbatas. Bandingkan dengan representasi basis 10, Anda bisa menambahkan semuanya dan menyimpannya dalam angka, tetapi angka mana yang, atau mungkin R adalah waktu 10.000, G adalah 100, dan B adalah ruangnya sendiri, itu banyak operasi matematika , biasanya penggandaan menghabiskan lebih banyak siklus daripada pergeseran, jadi bagian data Anda yang berikutnya sudah dalam antrian sebelum Anda selesai dengan bagian terakhir Anda sedang diproses, wah, itu hilang sekarang.
Terkadang lebih baik bekerja di basis 2, 8 atau 16. Dengan sebagian besar mesin, mengalikan 2 hanya dengan sedikit pergantian, itu sangat cepat, sama dengan pembagian dengan 2.
Untuk menguraikan lebih jauh tentang gagasan twiddling. Ada banyak waktu ketika bekerja di lingkungan tertanam yang saya perlukan untuk mengakses sejumlah susunan lampu, sakelar, atau beberapa item register yang dipetakan.
Dalam hal ini menugaskan seluruh karakter, byte, atau int untuk setiap switch akan menjadi tidak efisien dan konyol, switch atau lampu memiliki 2 posisi - on dan off - mengapa saya menetapkan sesuatu yang memiliki hingga 256 posisi, atau 2 ^ 16 posisi dll. Setiap lampu dalam array bisa 1 bit pas 8 atau 16 atau 32 atau 64 atau 128 (lebar tipe data Anda) pada satu kata / daftar. Efisiensi ruang diperlukan dan disambut baik.
Menggunakan apa pun yang berbasis 2 ^ n dalam pemrograman untuk hal-hal seperti menangani data RGB, banyak data sinyal - GPS, audio, ascii, dll - jauh lebih sederhana dalam hex, biner, dan oktal karena itulah yang diwakili dalam mesin dan satu dapat lebih mudah membedakan apa yang disajikan dan bagaimana cara memanipulasinya.
MENGGUNAKAN Basis Strange
Tidak ada efisiensi kecuali Anda kode untuk itu. Anda ingin basis 11, Anda harus menyiapkan tipe data untuknya dan membebani operator mana pun untuk menangani perwakilannya kepada pengguna. Saya tidak melihat alasan mengapa sistem memegang 5 item, dan hanya pernah memegang kelipatan 5 item yang perlu dikonversi ke matematika lima item. Dan selanjutnya, Anda sebaiknya berdoa agar siapa pun yang memutuskan untuk menulis kode mereka untuk base 271 mendokumentasikannya dengan baik atau Anda dapat menghabiskan lebih banyak waktu memahaminya daripada layak membuat base 271 karena semua item adalah kelipatan dari 271.
sumber
Kembali di zaman kuno komputer, kami memiliki sejumlah tampilan yang dapat menunjukkan angka 0-9, tetapi kami belum memiliki AF.
http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpg adalah salah satu contohnya ...
Oktal sangat cocok di layar ini dan lebih mudah daripada biner atau desimal.
sumber
Saya terkejut semua jawaban lain belum menyebutkan dua kegunaan yang sangat umum dalam komputasi untuk basis alternatif:
Kompresi : Sering diinginkan untuk merepresentasikan angka biner, desimal atau hex pada basis yang lebih besar untuk mempersingkat representasi. Sebagai contoh, semua penyingkat bit seperti bit.ly melakukan ini. Atau Anda dapat melakukannya untuk mempersingkat GUID untuk digunakan dalam URL.
sumber