2進数表現を16進数で表す方法とは?

このQ&Aのポイント
  • 大抵の言語では数値の出力において、8進数・10進数・16進数で表示できますが、2進数での数値の出力は対応していないと思います。
  • そこで、2進数表現での一桁を16進数で表すことにしました。8bitの2進数を32bitの16進数で表すわけです。
  • この表現方法は「16進化2進数」と呼べると思われます。英語だとHexadecimal-coded binary "HCB"です。
回答を見る
  • ベストアンサー

2進数表現を16進数であらわす・・・?

大抵の言語では数値の(ディスプレイへの)出力において、 8進数・10進数・16進数で表示できますが 2進数での数値の出力は対応していないと思います。 そこで、2進数表現での一桁を16進数で表すことにしました。 8bitの2進数を32bitの16進数で表すわけです。 例:x=0xAC → 0x10101100 (((x&0x80)<<21)|((x&0x40)<<18)| ((x&0x20)<<15)|((x&0x10)<<12)| ((x&0x08)<<9)|((x&0x04)<<6)| ((x&0x02)<<3)|(x&0x01)) ここで質問なのですが、 10進表現での1桁を4桁の2進数で表したものが、「2進化10進数」 では、上記のような表現方法は「16進化2進数」と呼んでも差し支えないのでしょうか? 英語だとHexadecimal-coded binary "HCB"でしょうか? 呼び名に誤りがあれば、なんと呼んだらしっくりくるでしょう?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

う~ん, 「16進数で表す」というのが, ちょっと曖昧なんですよね.... 最初に書いたことと関連するんですが, 例えば 2進数の 10110110 を B6 とするのも「2進数を 16進数で表す」と言えますよね. ですが, これは明らかに期待する動作ではありません. ということで, 「16進数」という表現は避けた方がいいかなぁと思いまして.... そう考えたときに, ちょうど「4ビット = 1ニブル」という表現があるので, こっちを使った方が安全ではないかと判断しました.

kenji_aki
質問者

お礼

回答ありがとうございます。 そうですよね。 そもそも、「16進数で・・・」というのが質問の意図及び呼び方に関して多くの誤解を与えてる気がします。 ご指摘の通りです。 1ビットを1ニブルで表現する。と言えば誤解を招くような事は無いと思います。 このような分かりにくい質問にお付き合いくださり大変感謝しております。 あらためて、お礼申し上げます。 ありがとうございました。

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

ちょっと思ったのが bit-to-nibble expansion. nibble ってあまり使われないけど「4ビット」の意味があります. だからこれで「1ビットから 4ビットへの拡張」と読ませることはできます.

kenji_aki
質問者

お礼

回答ありがとうございます。 出来ることなら「16進数で表される」といった意味も含まれると 分かりやすいと思いましたが、 1ビットを4ビットへ、と云うのはなかなかいい表現です。 参考にさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

あぁ, 計算式については完全に私の勘違いです. 申し訳ありません. ただ, この処理って必要なのかなぁ? 「16進で表現できればその時点で十分」じゃないのかな?

kenji_aki
質問者

補足

上手く説明できるか分かりませんが 実用性はあまりないです。 ただ、勉強用に使ったり確認用に使ったりします。 例えばアセンブリのコードが機械語に変換されたときに どのビットが何を表しているのかを視覚的に捕らえる場合や 複雑なビット演算をした場合にビットの変化を目で追って理解したい場合 2色BITMAPやフォントのグリフなんかをコンソールで表示したり バイト単位で意味のあるデータではなくビット単位で意味を持つデータの確認のために使います。

回答No.4

世界で、現在も使い続けられているCOBOLでは、 「PIC 1(n)」 というデータ型があります。 「PIC 1(8) BIT」なら、8ビットのことです。 「PIC 1(8)」なら8バイトで、2進数の1桁を1バイトで表します。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

数値を二進記数法で出力する関数とかなら 大抵の言語で簡単に作れるだろうから、 わざわざそういう形式を経由する必要性は感じないですね。 手間が余計に掛かるだけですし、何か工夫しないと表現できるビット数が1/4になってしまうし。 でも、数値リテラルを二進記数法で書きたいと思うことならたまにあるかな。 (rubyとかだと2進整数リテラルが使える。)

kenji_aki
質問者

補足

手間でしょうか? マクロにして、ちょこっと2進数で表示して見たいとき簡単に使えますよ。 #define nantoka(x) ・・・ printf("%.8X\n", nantoka(0xAC)); out>10101100 loopも関数も使わない一番手軽な方法だと思ってます。 出力系の関数にも簡単に渡せますしね。 で、呼び名が欲しいのですよ。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

たぶん, あまり顧みられる方法ではないので名前自体存在しないと思います. だから極論すれば「言った者勝ち」でしょう. 「ここでは Hexadecimal-coded binary と呼ぶんだ」といってしまえば勝ち. まあ, 16進数と 2進数は「同じもの」だという指摘を受けるかもしれませんが. 「しっくりくる呼び方」という点では, 「各ビットを 1ニブルであらわした」というとしっくりくるけど, 全然スマートじゃないし.... なお, この式が間違っていることは実際に確かめればわかります. もっと言うとシフト量が間違ってます.

kenji_aki
質問者

お礼

解答ありがとうございます。 名前自体ないのは重々承知しています。 ただ、言葉で説明するとなると長ったらしくなり 上手い表現が浮かばないのです。 2進表現で表示する方法、だけだと説明不足ですし 16進数を使って・・・などというと仰るとおり16進数と2進数は同じものなのでなんとも表しにくいわけです。 自分だけが分かるように名前をつければいいのでしょうけれど、暫くたつと何のコードだか分からなくなりそうなので、名前が欲しいのです。 式が間違っているとの指摘ですが・・・ちゃんと紙に書いてやってみましたよ。 実際にやっても間違いはありませんし。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

そのようなことをする必要性が思いつかなかった.... BCD には「2進数や 16進数は直感的に 10進数として考えるのが難しい」という点で存在意義があるけど, 「16進数で書いてあるものを 2進数で読み直すのは簡単」なんだから, こんなことをする理由が良く分からないです. ところで, その変換式は間違ってますね.

kenji_aki
質問者

補足

必要性といわれれば、単純にディスプレイに2進数を描画したい。 と、云う事のみであって他に使い道はありません。 2色のBITMAPを0と1で出力したり、ビット演算の結果の確認をしたり、 といったような使い方をします。 仰るとおり「10進数を2進数で読み直すのは簡単」ですが、 より視覚的に表現したいと思っただけです。 変換式が間違っているとはどういうことなのかわかりません。 上位のビットから論理積で取った値をシフトしてるだけです。 と、云った事は本当はどうでも良くて、呼び名に間違いがあるのかどうか、間違っているならなんと呼んだらしっくりくるのかと云うのが知りたいだけでして。

関連するQ&A

  • ゾーン10進数(アンパック10進数)の1桁の場合の表現方法は?

    ゾーン10進数(アンパック10進数)の1桁の場合の表現方法は? ゾーン10進数では上位にコード部を、下位に数値部を持ってきて、最下位バイトの上位には符号部を入れますけど、例えば-3なんかの場合は、どう表現するんでしょうか?複数桁の例示はよく見て理解できるんですが。また0の場合は符号部は+で表現するんでしょうか?

  • 32bitの浮動小数点数表現について悩んでいます

    情報処理の初心者です。 今、14070366(10)を数値データとしてとらえ、 32bitの浮動小数点数で表現するという問題について考えています。 14070366(10) =100111000001010000101110(2) 10進数を2進数に基数変換した部分、25桁が仮数部になるんですよね? 符号部は+なので0。 では指数部の7桁には何が入るのでしょうか? 以上が私の分かっていることですが、 最終的な解答を16進数で表記すると、 14070366はどうなるのでしょうか? お願いします。

  • 16進数のバイト数

    16進数のバイト数を出力させます。 printf("%d byte\n",sizeof(0x12)); ⇒4 byte 4bit×2=8bit(1byte)になると思ったのですが、なぜ4byteになるのでしょうか。 基礎的なことかもしれませんが、原因が分からず悩んでしまいました。 もしお分かりの方いらっしゃいましたら教えてください。

  • 10進数 → 2進数

    小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。たとえば、 (0.1)_10 = (0.0001100110011・・・)_2 ※(A)_xとは、数値Aのx進数表現というイミです。以下もこの表現を使います。 となるらしいですが、どうやればいいのでしょうか?わかりません。 また、ついでに聞いておきたいことがもう一つあります。小数点を含まない数値の 変換も教えていただきたいです。 たとえば今までぼくは、(101)_10を2進数に変換するのに、 (101)_10 = (100 + 1)_10 = ( 2^2・25 + 1 )_10 = ( 2^2・( 2^3・(2 + 1) + 1 ) +1 )_10 = (2^6 + 2^5 + 2^2 + 2^0 )_10 = (1100101)_2 などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか? コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…

  • 数値を2進数文字列に変換するものなんですが・・・

    数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

  • 2進数&10進数&16進数の変換

     ◆ コンピュータで使用される2進数  人が日常使用している数値は10進数ですが、コンピュータは内部で数値を表現する場合、2進数を使用  しています。しかし、「0」と「1」だけの2進数では人が分かりにくいため、人間が見えるところでは  コンピュータは2進数を10進数や16進数が変換して表現しています。ここではその変換方法を学びます。  ◆ 2進数  2進数とは、「0」と「1」の2種類の数字を用いて全ての数を表現します。10進数では0から数えて「9」の  次は位があがることになりますが、2進数では「 1 」の次に位があります。位があがれば、その新しい桁は   「 1 」 となり、それ以下の桁は全て 「 0 」 となります。それでは、2進数の数の増え方を見てみましょう。      ところで、2進数を表現する時は一般的に8桁単位で表現するため、8桁未満の場合は頭に0をつけます。  つまり、上の2進数の値は順番に 00000000 → 00000001 → 00000010 → 00000011 → 00000100 →  00000101 → 00000110 → 00000111 → 00001000 と表します。以下は2進数と10進数の対応表です。 2進数と10進数の対応表 10進数 0 1 2 3 4 5 6 7 8 9 10 ・・・ 2進数 0 1 10 11 100 101 110 111 1000 1001 1010 ・・・  ◆ 2進数から10進数への変換方法  10進数と2進数の対応表は以下の通りです。2進数の桁が上がる時の10進数の値が以下となります。 2進数と10進数の対応表2 10進数 1 2 4 8 16 32 64 128 2進数 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000  従って、2進数で「1」となっている桁に対応する上記の10進数の基準値を合計することにより、2進数から  10進数の値を求めることができます。例えば、2進数の「 00101010 」を10進数に変換する場合、基準値が  32、8、2の所でビットが1なので下図の通り、2進数の「 00101010 」は10進数では「42」だと分かります。            ◆ 10進数から2進数への変換方法  10進数の数値を「 0 」になるまで「 2 」で割り算していき、その結果の「余りの数 」を並べることで  ある10進数の値を2進数の値へ変換することができます。それでは、具体的に変換して見て行きましょう。           例えば、10進数の「160」を2で割り算していくと上図の結果となります。後は、余りの数を下から順番に  並べれば 「 10100000 」 の値が算出されます。次に、「22」を2で割り算していき余りの数を下から順に  並べれば 「 10110 」 の値が算出されます。ネットワークにおいては、2進数を一般的に8桁で表示する  ことから、8桁になるよう上位に「 0 」を追加して「 00010110 」とします。当然「 10110 」と同じ値。 因みにここ参照ですがhttp://www.infraexpert.com/study/ip1.html なぜこれが10進数なんでょうか? 10進数というのは、0から9までの数字が1増えて10になるんですよね? なのに2進数と10進数の対応表2を見ると 倍数になっているのですが、、 これはいったいどういう違いなんでしょうか? 回答お願いいたします。 ほかにも解らなそうな点は、教えて頂けると幸いです。

  • 10進数をBCDに変換する方法

    10進数から2進化10進数(BCD)に変換するところで疑問があります。 たとえば、10進数の3846をBCDに変換する場合答えはどのようになりますか? 私なりに考えたところまでを示しますが、答えがわかりません。 どこに考え方の間違いがあるのでしょうか? まず、3846を2進数に変換しました。 3846 → 0000111100000110 (2進数)となります。 ここからBCDに変換する場合、4ビットずつを1つと考えて数字を表現するので、上記の2進数の頭から4つずつ分けて考えると 1つ目 0000 2つ目 1111 3つ目 0000 4つ目 0110 の4つにわけました。 続いて、それぞれを10進化しました。 1つ目 0000 → 0 2つ目 1111 → 15 3つ目 0000 → 0 4つ目 0110 → 6 ここで疑問が出てきます。 2つ目のところで、1111を10進化すると15となってしまい桁上りが生じます。 この場合どのように処理するのが良いのでしょうか? どなたかご教授ください。

  • 10進数をBCDに変換する方法

    10進数から2進化10進数(BCD)に変換するところで疑問があります。 たとえば、10進数の3846をBCDに変換する場合答えはどのようになりますか? 私なりに考えたところまでを示しますが、答えがわかりません。 どこに考え方の間違いがあるのでしょうか? まず、3846を2進数に変換しました。 3846 → 0000111100000110 (2進数)となります。 ここからBCDに変換する場合、4ビットずつを1つと考えて数字を表現するので、上記の2進数の頭から4つずつ分けて考えると 1つ目 0000 2つ目 1111 3つ目 0000 4つ目 0110 の4つにわけました。 続いて、それぞれを10進化しました。 1つ目 0000 → 0 2つ目 1111 → 15 3つ目 0000 → 0 4つ目 0110 → 6 ここで疑問が出てきます。 2つ目のところで、1111を10進化すると15となってしまい桁上りが生じます。 この場合どのように処理するのが良いのでしょうか? どなたかご教授ください。

  • 2進数の足し算について

    CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。 そこで8bitの最上位桁を符号とした7bitの引き算-24+(-8)を計算してみたのですが 24(10進数)→0011000(2進数)→1101000(2の補数) 8(10進数)→0001000(2進数)→1111000(2の補数) 符号 7654321←bit  1 1101000 +1 1111000  X 1100000 となり、1100000の2の補数をとると 0100000(2進)→32(10進数)で答えを求められました。 そこでお聞きしたいのですが、値を足したとき(↑の例だと1100000)が求められたときにどういった条件だと1100000の2の補数をとる必要があるのでしょうか? ↑の例だとXがどの条件のときでしょうか? 質問が長くなってしまいましたがよろしくお願いします。

  • "2"が素数であることの証明

    自然数2は y1=sin(2πt)で表現できる。 t=0.5つまり半周期では y1=sin(2πx0.5)=0 一方自然数1は y2=sin(4πt)で表現できる。 t=0.5周期では y2=sin(4πx0.5)=0 つまり自然数”2”は”1”とそれ自身の”2”が約数と なる。つまり素数となる。 この証明は正しいでしょうか? 誤りがあるとしたらどこでしょうか?

専門家に質問してみよう