Saya telah melihat ke dalam matematika di balik konversi dari basis apa pun ke basis apa pun. Ini lebih tentang mengonfirmasi hasil saya daripada apa pun. Saya menemukan apa yang tampaknya menjadi jawaban saya di mathforum.org tetapi saya masih tidak yakin apakah saya benar. Saya memiliki konversi dari basis yang lebih besar ke basis yang lebih kecil oke karena hanya mengambil digit pertama dengan basis Anda ingin menambahkan pengulangan digit berikutnya. Masalah saya muncul saat mengkonversi dari basis yang lebih kecil ke basis yang lebih besar. Ketika melakukan ini mereka berbicara tentang bagaimana Anda perlu mengubah basis yang lebih besar yang Anda inginkan menjadi basis yang lebih kecil yang Anda miliki. Sebuah contoh akan pergi dari basis 4 ke basis 6 Anda perlu mengubah angka 6 menjadi basis 4 mendapatkan 12. Anda kemudian hanya melakukan hal yang sama seperti yang Anda lakukan ketika Anda mengkonversi dari besar ke kecil. Kesulitan yang saya miliki dengan ini adalah sepertinya Anda perlu tahu nomor apa yang ada di pangkalan lainnya. Jadi saya perlu tahu apa yang ada di dasar 4. Ini menciptakan masalah besar dalam pikiran saya karena saya akan membutuhkan sebuah tabel. Adakah yang tahu cara melakukan ini dengan cara yang lebih baik.
Saya pikir konversi basis akan membantu tetapi saya tidak dapat menemukan yang berfungsi. Dan dari situs yang saya temukan tampaknya memungkinkan Anda untuk mengkonversi dari basis ke basis tanpa melalui basis 10 tetapi Anda harus terlebih dahulu tahu cara mengubah angka pertama dari basis ke basis. Itu membuatnya agak tidak berguna.
Para komentator mengatakan bahwa saya harus dapat mengubah huruf menjadi angka. Kalau begitu saya sudah tahu itu. Namun itu bukan masalah saya. Masalah saya adalah untuk mengkonversi basis besar ke basis kecil saya harus terlebih dahulu mengkonversi nomor basis yang saya miliki ke nomor basis yang saya inginkan. Dalam melakukan ini saya mengalahkan tujuannya karena jika saya memiliki kemampuan untuk mengubah basis-basis ini ke basis-basis lain, saya sudah menyelesaikan masalah saya.
Sunting: Saya telah menemukan cara untuk mengkonversi dari basis kurang dari atau sama dengan 10 ke basis lain kurang dari atau sama dengan 10. Saya juga bisa beralih dari basis lebih besar dari 10 ke basis apa pun yang 10 atau kurang. Masalahnya dimulai ketika mengkonversi dari basis lebih besar dari 10 ke basis lain lebih besar dari 10. Atau pergi dari basis lebih kecil dari 10 ke basis lebih besar dari 10. Saya tidak perlu kode Saya hanya perlu matematika dasar di belakangnya yang dapat diterapkan pada kode.
sumber
string
dan mengembalikan aint
), dan algoritma yang mengambil angka dan mengembalikan perwakilannya di basis yang diberikan.Jawaban:
Ini sepertinya pertanyaan yang sangat mendasar bagi saya, jadi maafkan saya jika saya sedikit menguliahi Anda. Poin terpenting bagi Anda untuk belajar di sini adalah bahwa angka bukanlah representasi digitnya . Angka adalah objek matematika abstrak, sedangkan representasi digitnya adalah hal yang konkret, yaitu urutan simbol pada kertas (atau urutan bit dalam memori komputasi, atau urutan suara yang Anda buat saat Anda berkomunikasi angka). Yang membingungkan Anda adalah kenyataan bahwa Anda tidak pernah melihat angka tetapi selalu mewakili digitnya. Jadi Anda akhirnya berpikir bahwa angka adalah representasi.
Oleh karena itu, pertanyaan yang tepat untuk ditanyakan bukanlah "bagaimana saya mengkonversi dari satu basis ke basis lainnya" melainkan "bagaimana cara mencari tahu nomor mana yang diwakili oleh serangkaian angka" dan "bagaimana cara menemukan representasi digit dari suatu basis diberikan nomor ".
Jadi mari kita menghasilkan dua fungsi dalam Python, satu untuk mengubah representasi digit ke angka, dan yang lainnya untuk melakukan yang sebaliknya. Catatan: ketika kita menjalankan fungsi Python tentu saja akan mencetak pada layar nomor yang didapatnya di basis 10. Tapi ini tidak berarti bahwa komputer menyimpan angka di basis 10 (bukan). Tidak relevan bagaimana komputer merepresentasikan angka.
Mari kita uji ini:
Dipersenjatai dengan fungsi konversi, masalah Anda diselesaikan dengan mudah:
Sebuah tes:
Catatan: kami tidak melewati representasi basis 10! Kami mengonversi representasi basis ke angka, dan kemudian angka ke basis c . Jumlah itu tidak ada dalam representasi apa pun. (Sebenarnya itu adalah, komputer harus mewakilinya entah bagaimana, dan itu memang mewakilinya menggunakan sinyal listrik dan hal-hal funky yang terjadi dalam chip, tetapi tentu saja itu bukan 0 dan 1.)b c
sumber
fromDigits
mengembalikan angka di basis 10.Saya pikir cara terbaik untuk memahami ini adalah dalam diskusi dengan alien (setidaknya sebagai analogi).
Definisi adalah angka dalam basis bx b berarti adalah serangkaian digitx .<b
Contoh String angka 10010011011 adalah angka dalam basis 2, string 68416841531 adalah angka di basis 10, BADCAFE adalah angka di basis 16.
Sekarang Misalkan saya dibesarkan di planet QUUX di mana setiap orang diajarkan untuk bekerja diq selama hidup mereka, dan saya bertemu Anda yang terbiasa dengan . Jadi, Anda menunjukkan nomor, dan apa yang harus saya lakukan? Saya perlu cara untuk menafsirkannya:b
Definisi Saya dapat menginterpretasikan angka dalam basis (Catatan: b adalah angka dalam basis qb b q ) dengan rumus berikut
di mana menunjukkan string kosong, dan ˉ s d Menandakan string berakhir di digit dϵ s¯d d . Lihat bukti saya bahwa penambahan menambahkan untuk pengantar notasi ini.
Jadi apa yang terjadi di sini? Anda telah memberi saya nomor dalam basis dan saya telah menafsirkannya menjadi basis q tanpa filosofi aneh tentang apa sebenarnya angka itu.b q
Kunci Kunci untuk ini adalah bahwa fungsi dan + I adalah yang beroperasi pada basis q number. Ini adalah algoritma sederhana yang didefinisikan secara rekursif berdasarkan nomor q basis (string digit).× + q q
Ini mungkin tampak agak abstrak karena saya telah menggunakan variabel daripada angka aktual di seluruh. Jadi anggaplah Anda adalah makhluk basis 13 (menggunakan simbol ) dan saya terbiasa dengan basis 7 (yang jauh lebih masuk akal) menggunakan simbol α β γ δ δ ρ ζ0123456789XYZ αβγδρζξ
Jadi saya telah melihat alfabet Anda dan menabunya sebagai berikut:
Tabel perkalian quux
jadi saya sudah sejauh ini
Sekarang saya perlu melakukan penambahan menggunakan algoritma yang disebutkan sebelumnya:
begitu
sumber
Ini hanya refactoring (Python 3) dari kode Andrej . Dalam kode Andrej nomor diwakili melalui daftar digit (skalar), sedangkan dalam kode berikut nomor diwakili melalui daftar simbol yang diambil dari string khusus :
Untuk melakukan konversi dari nilai ke representasi di basis kustom:
Untuk melakukan konversi dari representasi (dalam basis khusus) ke nilai:
Untuk melakukan konversi basis dari satu basis pelanggan ke yang lain:
sumber
Operasi mendasar dari konversi basis adalah
toDigits()
operasi jawaban @AndrejBauer. Namun, untuk membuatnya tidak perlu membuat angka dalam representasi internal angka, yang pada dasarnya merupakan konversi dari dan ke basis 2 representasi. Anda dapat membuat operasi yang diperlukan dalam representasi basis asli.Jadi langkah pertama adalah melakukan operasi divisi modulo berulang
Karena representasi internal adalah digit, kita harus membuat fungsi khusus untuk menguji nol
Akhirnya kita harus membuat operasi modulo_div yang sebenarnya merupakan pembagian standar berdasarkan tujuan seperti yang kita pelajari di sekolah.
hanya pemeriksaan tes untuk memverifikasi kode sudah benar:
sumber
Saya tahu cara mudah untuk melakukan konversi basis yang tidak memerlukan program komputer. Ini dengan mendefinisikan cara untuk mengkonversi dari basis mana saja ke basis 2 dan sebaliknya dan kemudian mencakup dari satu basis ke basis lain dengan terlebih dahulu mengkonversi dari basis pertama ke basis 2 kemudian mengubah dari basis 2 ke basis lainnya. 2 sangat mudah dikalikan atau dibagi dengan basis apa pun.
Untuk mengkonversi dari basis mana saja ke basis 2, yang harus Anda lakukan adalah mengenali bahwa untuk nomor berapa pun, jika Anda mengambil notasi basis 2 dan mulai dari 0 dan kemudian untuk setiap digit secara berurutan dari kiri ke kanan dua kali lipat jika angka itu nol dan dua kali lipat dari tambahkan 1 jika angka itu adalah 1, Anda mendapatkan nomor itu sendiri. Sekarang diberi nomor itu di pangkalan apa pun, Anda dapat membagi dengan 2 di pangkalan itu untuk mendapatkan hasil bagi dan sisanya. Jika sisanya adalah 1, digit biner terakhir adalah 1 dan jika sisanya adalah 0, digit biner terakhir adalah 0. Bagilah dengan 2 lagi. Jika sisanya adalah 1, digit terakhir kedua adalah 1 dan jika sisanya adalah 0, digit terakhir kedua adalah 0 dan seterusnya hingga Anda mendapatkan hasil bagi 0.
Untuk mengonversi dari basis 2 ke basis apa pun, yang harus Anda lakukan adalah di basis itu, mulai dari 0, lalu untuk setiap digit biner dari kiri ke kanan, gandakan di basis itu jika digit itu adalah 0 dan dobel kemudian tambahkan 1 di dalamnya mendasarkan jika digit itu adalah 1.
sumber
2 is so easy to multiply or divide by in any base.
Saya tidak melihat bahwa untuk pangkalan aneh yang lebih dari satu dari kekuatan dua (11 dan 13, untuk memulai).Anda dapat mengonversi dari basis n ke basis 10 tanpa konversi apa pun ke beberapa basis perantara.
Untuk mengkonversi dari basis n ke basis 9, misalnya, Anda mengambil algoritma untuk konversi ke basis 10, dan ganti "10" dengan "9". Sama untuk basis lainnya.
sumber