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

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

ただいまの
回答率

90.49%

  • Java

    13818questions

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

  • Ruby

    7687questions

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

  • Python 3.x

    6432questions

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

  • セキュリティー

    464questions

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

  • 暗号化

    78questions

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

26進数の解釈について

受付中

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 531

that

score 2

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

回答 6

+8

26進数7桁の情報量は、

>>> import math
>>> math.log2(2**32)
32.0
>>> math.log2(26**7)
32.90307802698764

なのでいけるでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

回答が出そろってますけども

「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進数の本質さえ分かっていれば「計算機言語の整数に関する演算子の知識」があればプログラミングできます。

alphabets = ''.join(chr(ord('a') + i) for i in range(26))
base = len(alphabets)

def alphabets_to_number(a):
    n = 0
    for c in a:
        d = alphabets.index(c)
        n = n * base + d
    return n

def number_to_alphabets(n, l=7):
    a = ''
    for _ in range(l):
        d = n % base
        a = alphabets[d] + a
    return a

print(alphabets_to_number('zzzzzzz'))         # 8031810175
print(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/27 06:06

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

    キャンセル

  • 2018/06/27 12:32

    コメントありがとうございます。よく読むとおっしゃるとおりのようです。

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

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

    キャンセル

  • 2018/06/27 12:52

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

    キャンセル

  • 2018/06/27 13:46

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

    キャンセル

+1

1文字を8bit(1byte)で表現することには関係なく、単に0-25をA-Zに振るということな気がします。

こんな感じかな。

import string
d = {i:v for i,v in enumerate(string.ascii_uppercase)}
inv_d = {v:k for k,v in d.items()}

val = 1234567
print(val)

# 変換
result = []
tmp = val
for _ in range(7):
    result.append(d[tmp%26])
    tmp //= 26
print("".join(reversed(result)))

# 逆変換
total = 0
for i,c in enumerate(result):
    total += inv_d[c] * (26**i)
print(total)

""" =>
1234567
AACSGHJ
1234567
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/26 20:18

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

    1234567



    00000000000100101101011010000111



    ???????

    キャンセル

  • 2018/06/26 20:21 編集

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

    キャンセル

  • 2018/06/26 20:28

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

    キャンセル

0

26進数の作り方と文字の解釈次第ですね。順当に考えれば0-9の数値10記号とa-oの文字16記号を使うことを考えますね。ちなみに、キリがいいのでa-zの文字26記号のみで数値を表現するというのも面白いです。

32ビット数値は(符号無し整数で考えれば)十進数で0-4294967295の値を取りうる可能性があります。一方、7桁の26進値のは、十進数で0-8031810176の値を取りうる可能性がありますので値が被ることはありえます。

もっとも、こんな表記をしようとする意図はわかりませんが。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

26進数の各桁を0-9およびa-pで表現するのであればInteger#toString()が使えます。
(逆はInteger#parseInt())

System.out.println(Integer.toString(Integer.MIN_VALUE, 26));
System.out.println(Integer.toString(Integer.MAX_VALUE, 26));

-6oj8ioo
6oj8ion

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13818questions

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

  • Ruby

    7687questions

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

  • Python 3.x

    6432questions

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

  • セキュリティー

    464questions

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

  • 暗号化

    78questions

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