質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

6回答

3942閲覧

26進数の解釈について

that

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2018/06/26 11:01

バイナリーの32bit数値を26進数で解釈し7文字のアルファベットにするってありえますか?

7文字なら56bit数値である必要があると思ったのですが。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/06/27 04:26

なぜ56bit必要だと思ったのでしょうか?(念のため聞いてみます)
guest

回答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

YouheiSakurai

総合スコア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
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/06/26 21:06

>ということで33bit必要です。ゆえに32bitだと「任意の7文字を表現するにはちょっと足りないけど概ね表現できる」と言えます。 のくだりは、問題設定からすると「32bit以上の情報が持てるので7文字で任意の32bit数値を表現できる」の方がわかりやすいかもしれません。 というか、 「それぞれ表せる数が何通りかを計算すると、 2^32 = 4294967296 26^7 = 8031810176 なので完全に表現でき、しかも半分弱のお釣りがある」 という説明で良いのではないでしょうか。
KSwordOfHaste

2018/06/27 03:32

コメントありがとうございます。よく読むとおっしゃるとおりのようです。 >7文字なら56bit数値である必要があると思ったのですが。 という一文から「7文字を表現するのには56bit必要であり、32bitでは全然足りない」と質問者さんが考えておられる点に着目してコメントし始めたのでこういう回答をしてみました。
swordone

2018/06/27 03:52

123 - (123//10)だと122にならない?
KSwordOfHaste

2018/06/27 04:46

これはしたり・・・ご指摘ありがとうございました。訂正しました。
guest

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
hayataka2049

総合スコア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
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

べつになんでもありえますぜ
というか、なんでありえないと思うのか


そんな難しい計算せんでも、
26ってのは5ビットで表すにはちょっと足りない、が、そこはおまけしといて5ビットだとすると、
32ビットの数値を表現しようとする場合、32/5で6桁では足りず、7桁必要なことがわかりますな。

投稿2018/06/26 11:04

編集2018/06/26 22:29
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

that

2018/06/26 11:18

ご回答ありがとうございます。 例えば、1234567を2進数に変換して、26進数で解釈し7文字のアルファベットにするとしたらどうなりますでしょうか? 1234567 ↓ 00000000000100101101011010000111 ↓ ???????
y_waiwai

2018/06/26 11:22 編集

26の剰余を出して(これをアルファベットに)、26で割っていきましょう
y_waiwai

2018/06/26 11:28

pythonやらJavaができるなら、これぐらいのコードはすぐ組めるでしょ。 やってみようねっ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問