Mengapa menggunakan basis nomor lain saat pemrograman


35

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?


6
Apakah Anda memiliki contoh spesifik yang mengangkat pertanyaan ini? Hal-hal yang ada di basis-2 atau basis-16 jelas memiliki manfaatnya karena lebih mudah dipahami oleh komputer.
KDiTraglia

4
Apa yang dimaksud dengan "angka pemrograman dalam basis ..."? Ada angka. Periode. Mereka diwakili secara internal di beberapa pangkalan tapi itu sebagian besar tidak masalah, dan tidak mengubah apa pun aturan aritmatika.

12
@JMD - silakan bekerja dengan moderator untuk menghapus salah satu dari dua posting silang Anda dan menempatkan satu di sini di P.SE. Posting silang di seluruh situs tidak disukai. Mod dapat memigrasikan pertanyaan untuk Anda.

10
@JMD - Posting silang masih bukan sesuatu yang harus Anda lakukan. Ada proses migrasi untuk pertanyaan semacam itu, jika perlu .
Oded

2
@JMD Jangan posting silang, pertanyaan yang cocok untuk lebih dari satu situs sangat jarang. Kali ini misalnya, pertanyaan Anda tidak pada topik di Stack Overflow. Tetapi bahkan jika pertanyaan Anda cocok untuk kedua situs, belanja pertanyaan Anda di sekitar situs umumnya tidak disukai. Kita semua secara sukarela menghabiskan waktu di sini, setidaknya Anda bisa menunggu beberapa saat untuk mengevaluasi jawaban yang Anda dapatkan di Stack Overflow sebelum posting silang.
yannis

Jawaban:


59

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::

main() {
    unsigned char codevalue = 0x94; // 10 010100
    printf("x=%d, y=%d\n", (codevalue & 0xc0) >> 6, (codevalue & 0x3f));
}

menghasilkan

x=2, y=20

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 0x3fmemiliki semua bit atur nibble rendah, dan dua bit atur nibble tinggi.

Anda juga bisa menulis baris kedua dalam oktal:

printf("x=%d, y=%d\n", (codevalue & 0300) >> 6, (codevalue & 077));

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.


Contoh lain bisa berupa penggunaan "angka ajaib" 0xDEADBEEF. Lihat posting ini stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

Alasan utama saya menggunakan basis yang berbeda adalah ketika saya peduli dengan bit.

Jauh lebih mudah dibaca

int mask=0xFF;
byte bottom_byte = value & mask;

dari

int mask=255;
byte bottom_byte = value & mask;

Atau gambar sesuatu yang lebih kompleks

int mask=0xFF00FF00;
int top_bytes_by_word = value & mask;

dibandingkan dengan

int mask=4278255360; //can you say magic number!? 
int top_bytes_by_word = value & mask;

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.

0xFF = b11111111 = 255
0xFFFF = b1111111111111111 = 65536
0xF0F0 = b1111000011110000 = 61680

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.


2
Oktal tidak jarang sama sekali, 0 oktal :) (melihat bahwa di suatu tempat di jaringan Stack Exchange, tidak dapat menemukannya sekarang).
gerrit

2
@ Elarlz: orang-orang dengan banyak jari. :-)
Bryan Oakley

3
26 x 2 + 10 = Semua huruf besar dan kecil dan semua angka. Tidak terlalu aneh. Saya juga telah melihat Basis 36 digunakan, yang hanya versi non-case-sensitif yang sama.
Darrel Hoffman

3
@vasile: Ada 60 menit dalam satu jam dan 60 detik dalam satu menit karena orang menggunakan sistem basis-60, bukan sebaliknya. Saya harap Anda tidak percaya bahwa ada sesuatu di alam yang mengatakan harus ada 60 menit dalam satu jam!
Joren

1
ya, mereka membacanya di bintang-bintang dan mereka menggunakan base-60 karena mengukur waktu. dengan 360 hari (= 6x60) setahun tidak terlalu gila untuk mengukur waktu di basis-60.
ytg

8

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 .


3
Kompiler tidak peduli. Meskipun memang lebih mudah untuk mengkonversi antara basis yang Anda daftarkan, konversi sederhana (lambat-ish) untuk basis 10 secara khusus juga tidak sulit, dan sebagian besar bahasa berguna untuk konstruksi kompiler (Anda tidak menggunakan perakitan untuk itu) memilikinya konversi tersedia di perpustakaan standar mereka, sehingga secara efektif gratis untuk kompiler.

1
Menggunakan heksadesimal dalam C tidak diterjemahkan ke program yang lebih cepat. Kompiler tidak peduli basis apa yang Anda gunakan.
Charles Salvia

5
Tidak peduli apa dasar program ini ditulis, kompiler menerjemahkannya ke biner pada waktu kompilasi. Instruksi perakitan identik.
Karl Bielefeldt

2
Komputer perusahaan sebenarnya berdasarkan pada bool tri-enery: benar, salah dan "file tidak ditemukan"
Martin Beckett

6

Mungkin jika Anda sedang menulis permainan yang mensimulasikan ekonomi beberapa peradaban kuno yang menggunakan sistem basis 12.


4

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.


Oktal sering digunakan untuk menentukan nilai karakter dan terkadang untuk membuang data biner.
Caleb

3

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:

 0000 0     0001 1     0010 2     0011 3
 0100 4     0101 5     0110 6     0111 7

 1000 8     1001 9     1010 A     1011 B
 1100 C     1101 D     1110 E     1111 F

Ini membuka banyak kemungkinan:

  • Ketika suatu angka mewakili komposisi angka-angka biner yang bermakna, Anda dapat menentukan masing-masing komponen tanpa komputer. Sebagai contoh, jika angka 24-bit mewakili warna dalam RGB, itu sepele untuk mengatakan bahwa itu 0xFF00FFadalah magenta (Merah + Biru); tugasnya jauh lebih sulit ketika Anda disajikan16711935
  • Ketika sebuah angka mewakili bit mask, lebih praktis untuk menuliskannya sebagai angka hex yang ringkas, daripada angka biner yang jauh lebih lama
  • Arsitektur tertentu keluar dari jalan mereka untuk membuat kode biner mereka mudah dibaca ketika dicetak sebagai angka oktal. PDP-11 adalah salah satu sistem seperti itu: bit yang paling signifikan akan membiarkan Anda memberi tahu operasi 8-bit dari yang 16-bit; dua kelompok oktal terakhir akan membiarkan Anda memberi tahu dua register yang terlibat dalam operasi, dan seterusnya. Saya tahu beberapa orang yang bisa membaca kode biner PDP-11 dari layar tanpa disassembler, tetapi mereka membutuhkan kode mesin untuk dicetak dalam sistem oktal.

2

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 dengan0xangka 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:

int n = 10;

Tujuannya adalah untuk membuat variabel integer dan menginisialisasi dengan angka desimal 10. Apa yang dilihat komputer?

i  n  t     n     =     1  0  ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)

Compiler akan membatalkan ini, dan menyadari bahwa Anda mendeklarasikan variabel tipe intdengan nama n, 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 membaca 1 0diikuti 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 0xuntuk menentukan bahwa nilai berikut dalam heksadesimal, maka kami mendapatkan yang berikut:

i  n  t     n     =     0  x  1  0  ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)

Compiler melihat 0x(0x30 0x78) dan mengakui itu sebagai awalan base-16, jadi mencari nomor base-16 yang valid mengikutinya. Hingga terminator pernyataan, berbunyi 10. 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 intvariabel 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. ;)


1

mengapa ada orang yang pergi keluar dari jalan mereka ke nomor program dalam basis selain basis 10.

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!


1

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.


1
Oktal adalah karena PDP memiliki 9/18 bit byte, angka oktal mewakili 3bit jadi jika byte Anda habis dibagi 3, itu sangat masuk akal
Martin Beckett

1
Oktal juga digunakan pada beberapa sistem 16-bit (terutama PDP-11), karena 15 - jumlah bit kecuali bit tanda - terbagi dengan baik menjadi 3. Ia digunakan secara luas di seluruh sistem operasi UNIX yang asli (misalnya, "od" adalah alat standar untuk membuang file biner, dan format defaultnya adalah 16-bit octal daripada 8-bit hex), bukan hanya untuk izin. Mungkin juga relevan bahwa set instruksi PDP-11 memiliki dua bidang operan 6-bit.
Random832

Oktal juga digunakan karena dapat ditampilkan pada teknologi saat itu. Tabung Nexi, siapa pun? Atau tampilan 0-9 lainnya? Butuh beberapa saat untuk tampilan AF muncul.
Jeremy J Starcher

1

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.


1

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.


1

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 0x00ff00dan 65280dalam 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 sebagai 0x800080sedangkan nilai desimal untuk ini akan menjadi 8388736. Semakin mudah ketika bekerja dengan nuansa abu-abu - 50% abu-abu adalah 0x808080(hex) dan 8421504(desimal), 75% adalah 0xC0C0C0dan 12632256, 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: #00ff00untuk hijau, dan kadang-kadang juga disingkat menjadi hanya tiga digit, seperti #0f0untuk hijau.


0

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:

  • banyak operasi lebih efisien di basis 2:
    • kekuatan perkalian, pembagian, dan modulo dari 2 jauh lebih cepat daripada pembagian umum
    • flag dan nilai-nilai kecil dapat disimpan, diambil, dan dimanipulasi lebih efisien sebagai digit biner dari angka yang lebih besar.
  • operasi yang membaca, menulis, dan memanipulasi file data dan aliran data jaringan harus berurusan langsung dengan fakta bahwa mereka direpresentasikan sebagai angka biner.

Juga, selalu ada aplikasi langka yang secara inheren membutuhkan basis aneh yang mungkin bukan 2 atau 10.


2
Tentu saja saya akan menggunakan pohon 10-ary. Apa 2karakter aneh yang Anda gunakan ini?
CodesInChaos

0

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.



0

Saya terkejut semua jawaban lain belum menyebutkan dua kegunaan yang sangat umum dalam komputasi untuk basis alternatif:

  1. Pengkodean : Pengkodean Base64 misalnya sangat umum. Pengkodean hanya menginterpretasikan serangkaian byte sebagai angka biner besar (basis-2) dan mengubah angka itu menjadi angka Base64 yang diwakili oleh digit ASCII.
  2. 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.

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.