バイナリーの32bit数値を26進数で解釈し7文字のアルファベットにするってありえますか?
7文字なら56bit数値である必要があると思ったのですが。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/27 04:26
回答6件
0
26進数7桁の情報量は、
python
1>>> import math 2>>> math.log2(2**32) 332.0 4>>> math.log2(26**7) 532.90307802698764
なのでいけるでしょう。
投稿2018/06/26 11:19
総合スコア6142
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
回答が出そろってますけども
「N進数」なるものを普段使うことが少ないためプログラマーでない一般の人は「N進数の本質」をあまり気にしてない人が大多数だと思います。N進数の本質をよく理解できれば質問者さんの疑問は解消できます。
例えば10進数で123は
1 * (10^2) + 2 * (10^1) + 3 * (10^0)
(ここではx^yはxのy乗と思ってください)
のことですよね・・・。10進数しか使わないことが多いので各桁の重みは1, 10, 100, 1000, ...のように「10進数で表現した数値としてゼロがi個並んだ値」という程度の理解しかしていないケースも多かろうと思いますが数学的に考えるならこれはi番目の桁の重みを10^iとするのが10進数数であり10進数の代わりにN進数にするなら重みはN^iになるということがわかっていればよいです。
さて26進数で7つのアルファベットを表すということは、各桁(0~25)をアルファベットに割り当てて、26進数で7桁の数値で表現するという意味なので0
~(26^7)-1
の範囲の数値が表現できればあらゆるアルファベット7つの列を表現できることになります。
26^7 = 8031810176
ですので0 ~ 8031810175
の範囲の数値が表現できればよいですがこれを2進数で表すと何ケタ必要かというのが要するにビット数の定義なので
log2(26^7) = log(26^7)/log(2) ≒ 32.90307802698764
ということで33bit必要です。ゆえに32bitだと「任意の7文字を表現するにはちょっと足りないけど概ね表現できる」と言えます。
7文字なら56bit数値である必要がある
これは
- N進数で表現することの本質的な意味
- 計算機の(ISO-8859-1のような)符号化方式が大雑把に言えば256進数の各桁をアルファベットとした方式であること
つまり1文字が256通りのアルファベットである符号化方式であり1文字文で8bit必要になるということ
を把握できていないことからくる誤解といってよいと思います。
上記のN進数の意味がきちんと把握できていて、かつ計算機言語で剰余と整数除算(数学的除算結果の小数部を切り捨てる)の機能が把握できていれば、任意の整数値とその整数値をN進数で表現した各桁との間の相互変換が考えられると思います。
例えば10進数の123
の100の位の桁1
はどうやれば求まるかと言えば
切り捨て(123 / 100) => 1
ですね。Pythonでこれを表現するには
123 // 100
でよいです。この桁を覗いた残り23は
123 - (123 // 100) * 100
ですから、これを繰り返せば10の位が2
、1の位が3
であることが計算できます。これは「高位の桁から求める方法」です。
逆に剰余演算子を用いると「低位の桁から求める」ことができ、
123 % 10
が3であり、
123 - 123 % 10
が1の位を取り除いた残りの桁だけの値120になりますので120を10で割って12にし、同じことを繰り返せば10の位が2
、100の位が1
であることも計算できます。
ということで、N進数の各桁と全体の数値との間の相互変換はN進数の本質さえ分かっていれば「計算機言語の整数に関する演算子の知識」があればプログラミングできます。
Python
1 2alphabets = ''.join(chr(ord('a') + i) for i in range(26)) 3base = len(alphabets) 4 5def alphabets_to_number(a): 6 n = 0 7 for c in a: 8 d = alphabets.index(c) 9 n = n * base + d 10 return n 11 12def number_to_alphabets(n, l=7): 13 a = '' 14 for _ in range(l): 15 d = n % base 16 a = alphabets[d] + a 17 return a 18 19print(alphabets_to_number('zzzzzzz')) # 8031810175 20print(number_to_alphabets(8031810175)) # 'zzzzzzz'
上記は26進数の各桁をa
=0, b
=1, ..., z
=25として計算するコードですが、
alphabets = '0123456789'
に変更すればそのまま10進数に対する計算になりますし
alphabets = '01'
に変更すれば2進数に対する計算になります。
長々書きましたが「2進数」「16進数」などで検索すると「桁」と「全体の数値」との相互変換のやりかたは沢山の解説ページがヒットします。しかし本当はごちゃごちゃしているように見えて普段使っている10進数の本当の意味が分かっていれば実はなんということもない変換であることがわかる気がします。「2進数の変換方法はこう」「16進数はこう」なんて特別扱いして理解したり覚えたりする必要はないように思うのです。普段10進数の数値をどう捉えているか、つまり「わかっているようで実は10進数のことをわかっていない」ことが問題の本質ではないかと思ったりします。いかがでしょうか。
投稿2018/06/26 20:48
編集2018/06/27 04:46総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/26 21:06
2018/06/27 03:32
2018/06/27 03:52
2018/06/27 04:46
0
1文字を8bit(1byte)で表現することには関係なく、単に0-25をA-Zに振るということな気がします。
こんな感じかな。
python
1import string 2d = {i:v for i,v in enumerate(string.ascii_uppercase)} 3inv_d = {v:k for k,v in d.items()} 4 5val = 1234567 6print(val) 7 8# 変換 9result = [] 10tmp = val 11for _ in range(7): 12 result.append(d[tmp%26]) 13 tmp //= 26 14print("".join(reversed(result))) 15 16# 逆変換 17total = 0 18for i,c in enumerate(result): 19 total += inv_d[c] * (26**i) 20print(total) 21 22""" => 231234567 24AACSGHJ 251234567 26"""
投稿2018/06/26 11:56
編集2018/06/26 12:05総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
26進数の各桁を0-9およびa-pで表現するのであればInteger#toString()が使えます。
(逆はInteger#parseInt())
java
1System.out.println(Integer.toString(Integer.MIN_VALUE, 26)); 2System.out.println(Integer.toString(Integer.MAX_VALUE, 26));
→
java
1-6oj8ioo 26oj8ion
投稿2018/06/26 12:21
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
26進数の作り方と文字の解釈次第ですね。順当に考えれば0-9の数値10記号とa-pの文字16記号を使うことを考えますね。ちなみに、キリがいいのでa-zの文字26記号のみで数値を表現するというのも面白いです。
32ビット数値は(符号無し整数で考えれば)十進数で0-4294967295の値を取りうる可能性があります。一方、7桁の26進値のは、十進数で0-8031810176の値を取りうる可能性がありますので値が被ることはありえます。
もっとも、こんな表記をしようとする意図はわかりませんが。
投稿2018/06/26 12:03
編集2018/06/26 12:44総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
べつになんでもありえますぜ
というか、なんでありえないと思うのか
そんな難しい計算せんでも、
26ってのは5ビットで表すにはちょっと足りない、が、そこはおまけしといて5ビットだとすると、
32ビットの数値を表現しようとする場合、32/5で6桁では足りず、7桁必要なことがわかりますな。
投稿2018/06/26 11:04
編集2018/06/26 22:29総合スコア87719
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。