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となってしまい桁上りが生じます。
この場合どのように処理するのが良いのでしょうか?

どなたかご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

BCDに変換する際、数値全体を2進数に変換する必要はありません。


各桁を構成している数値を2進数に変換して、合体させればよいです。
10進数の3846をBCDに変換するのであれば、
3 → 0011
8 → 1000
4 → 0100
6 → 0110
より、
0011 1000 0100 0110
です。
    • good
    • 4
この回答へのお礼

2進数に変換せずにそのままでOKだったんですね。
理解しました。ありがとうございます。

お礼日時:2014/11/27 18:08

追記。



桁数が最初から判っているなら(変換する桁数が固定なのであれば)

3846を1000で割った商を10で割った余り⇒3⇒0011

3846を100で割った商を10で割った余り⇒8⇒1000

3846を10で割った商を10で割った余り⇒4⇒0100

3846を1で割った商を10で割った余り⇒6⇒0110

と言うように、先頭から求めていく事も出来ます。
    • good
    • 2
この回答へのお礼

わかりやすい回答ありがとうございます。
理解できました!

お礼日時:2014/11/27 18:06

>たとえば、10進数の3846をBCDに変換する場合答えはどのようになりますか?



3846を10で割った余り「6」を求め、2進数にする。

6⇒0110

3846を10で割って「384」にする。小数点以下切り捨て。

384を10で割った余り「4」を求め、2進数にする。

4⇒0100

384を10で割って「38」にする。小数点以下切り捨て。

38を10で割った余り「8」を求め、2進数にする。

8⇒1000

38を10で割って「3」にする。小数点以下切り捨て。

3を10で割った余り「3」を求め、2進数にする。

3⇒0011

4桁分変換したので、終了。

最後から逆に順番に並べると

0011 1000 0100 0110

と言う16ビットになる。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q正四面体の性質について 高校数学について質問です。 正四面体A-BCDがあるとして、「点Aから△BC

正四面体の性質について


高校数学について質問です。
正四面体A-BCDがあるとして、「点Aから△BCDに下ろした垂線が△BCDの中心を通り、△BCDの外接円の中心である」ということは、答案を書く際、証明しなければいけないことなのでしょうか?
それとも、自明であり証明不要なのでしょうか?

Aベストアンサー

「点Aから△BCDに下ろした垂線が△BCDの中心を通り、△BCDの外接円の中心である」
を証明しろ、という問題なら証明する必要があります。
上の文章が書かれていて、そこから何かを求めよ、という問題なら証明する必要はないと思います。
問題文が書かれていないのですが、実際の問題文から判断するしかないですね。

Q進数変換のプログラムタイトルの由来

進数変換のプログラムのタイトルでは
dec2bin
dec2hex
bin2dec
bin2hex
hex2bin
hex2dec
などのタイトル名を聞きます
dec(10進),bin(2進),hex(16進)なのは分かるのですが、真ん中の"2"の意味がわかりません。このタイトルの由来を知っている方是非教えてください。

Aベストアンサー

英語の慣用表現で2=toです from dec to bin
forを4 youをuなどと書きます

QLISP - (BCD) から B だけを取り出したいです。

学校でLISPを使ってのプログラミングの宿題が出ました。
初めてなので、わからないことだらけなのですが、
(A BCD)からAを取り出すには
(CAR '(A BCD))
で取り出せますよね。
(BCD)からBだけ、もしくはCだけを取り出すにはどうすればよいのでしょうか?
どうぞよろしくお願いします。

Aベストアンサー

専用の組み込み関数はなかったと思いますが、

(make-symbol (subseq (symbol-name 'bcd) 0 1))

とすればできます。
最後にできたシンボルを現在のpackageに登録したければ、make-symbol を intern にしてください。

QX86アセンブラで 16進数を10進数のASCIIコードに変換する方法

X86アセンブラで16進数から10進数のASCIIコードに変換する方法を模索しております。

例:  0x64(100d)
期待値:0x31 0x30 0x30 ("1","0","0"の3ByteのASCIIデータ)

といった内容になります。
論理演算等で求める手法がございましたら、ご教授頂ければ幸いです。

Aベストアンサー

テーブルを用意すればコード自体は簡単にできますが、その他の解です。

hexに16進数、asciiに変換後のASCIIコードの10進数を格納するとします。

hex db ?
ascii db 3 dup (?)

コードは以下になります。

moval,hex
aam
oral,30h
movascii+2,al

moval,ah
aam
orax,3030h
movascii,ah
movascii+1,al

QBCD形式で時刻を!

「時刻文字列・YYYYMMDDhhmmを
unsigned char u_str[5]というような変数に、
BCD形式でYYMMDDhhmm(5バイト)で格納したい」
というのがやりたいことです。
BCD形式の意味はわかったんですが、
1バイトにどうやって2文字分を入れるのかわかりません。
また、できたら戻し方のアドバイスもお願いします。
(BCD形式5バイト→YYYYMMDDhhmm形式12バイト)
質問を見てわかるように初心者です。
何卒、アドバイスよろしくお願い致します!

Aベストアンサー

BCD形式というのは(大雑把に言えば)、10進数の各桁をバラバラに2進数化して、くっつけ直したものです。
例えば、27(10進)という値は、各桁が
 2(10進) → 0010(2進の2)
 7(10進) → 0111(2進の7)
なので、BCD形式では 00100111(2進) となります。(10進で表すと、39)

つまり、1バイトを上下4ビットずつに分けて、それぞれに10進数の各桁を格納するわけです。

では、「どうやって上下4ビットに値を入れるか」についてですが、これは「シフト」を使えば簡単にできます。
(10の桁を上位に、1の桁を下位に格納するとします。)
1.それぞれの桁に該当する「数字」を「数値」に変換します。
 数字から数値への変換ですが、文字列の中の1文字の変換なので、文字コード操作('0' を引く)で十分でしょう。
2.10の桁は4ビット分上位へずらす必要があるので、4ビット分左へシフトします。
3.その値を1の桁の値とくっつけます。
 これは足し算かビット論理和で行えます。(普通はビット論理和を使います。)

これをコード化するとこんな感じ。
  int DecStr2BCD(const char *str) {
    int keta10, keta1;

    keta10 = str[0] - '0';
    keta1 = str[1] - '1';

    keta10 <<= 4;

    return keta10 | keta1;
  }
※これは2バイトの数字列→BCDコードの下請け関数なので、日時文字列から必要なアドレスを取り出し、ループしながら DecStr2BCD() を呼び出す関数を作成する必要があります。

また、BCDコードから数字列への逆変換ですが、これは次のような手順になります。
1.1バイトのBCDコードを、上下4ビットに分解して2つの値を取り出す。
 4ビットずつの分解には、シフト以外にマスクという手法を用います。
 マスクとは、ビット論理積を使い、特定のビットを0にしてしまう方法です。
2.それぞれの値を文字列して、バッファに書き込む。

コード化するとこんな感じ。
  void BCD2DecStr(char *str, int bcd) {
    int keta10, keta1;

    keta10 = bcd >> 4;
    keta1 = bcd & 15;  /* 15 は 00001111 */

    str[0] = keta10 + '0';
    str[1] = keta1 + '0';
  }
※同様に下請け関数なので、5バイトのBCDコードを1バイトずつ、その結果を書き込む日時文字列内のアドレスと共に BCD2DecStr に渡す関数を作る必要があります。
また年については、00~は20xxにし、~99は19xxにする必要があります。境目はプログラムの用途に応じて変えるとよいでしょう。

多少難しいと思いますので、分からないところは補足してください。

参考URL:http://www5c.biglobe.ne.jp/~ecb/assembler/3_1.html

BCD形式というのは(大雑把に言えば)、10進数の各桁をバラバラに2進数化して、くっつけ直したものです。
例えば、27(10進)という値は、各桁が
 2(10進) → 0010(2進の2)
 7(10進) → 0111(2進の7)
なので、BCD形式では 00100111(2進) となります。(10進で表すと、39)

つまり、1バイトを上下4ビットずつに分けて、それぞれに10進数の各桁を格納するわけです。

では、「どうやって上下4ビットに値を入れるか」についてですが、これは「シフト」を使えば簡単にできます。
...続きを読む

Q10進数を2進数に変換するプログラム

このアセンブラのプログラムはIN命令によって3桁のレコードに入力された10進数の値を2進数に変換するプログラムです。

INPUT START                      (1)
RPUSH                      (2)
IN IBUF,ILEN ;レコードを入力       (3)
    LD GR0,ILEN                (4)
JMI FIN2 ;ファイルの終わり      (5)
LD GR1,=0   ;けた数のカウンタ      (6)
LD GR4,=0   ;数値の初期化        (7)
LOOP2 LD GR3,IBUF,GR1               (8)
AND GR3,=#000F ;数字を数値に変換      (9)
LD GR5,GR4;ここから↓4つの命令はGR4を10倍する (10)
SLL GR5,3;                   (11)
SLL GR4,1;                   (12)
ADDA GR4,GR5;                  (13)
ADDA GR4,GR3                   (14)
ADDA GR1,=1                   (15)
CPA GR1,GR0                   (16)
JMI LOOP2                    (17)
LD GR0,GR4                   (18)
FIN2 RPOP                         (19)
RET
ILEN DS 1
IBUF DS 256
END

(8)のLOOP2 LD GR3,IBUF,GR1の命令なのですが、「これはIBUFとGR1のアドレスをたしてGR3にその内容を格納する。」という意味であり、その後(14)で10倍されたGR4にたしています。

質問としては、この2進数に変換するプログラムでGR3とGR4の役割を教えていただきたいです。

GR1はレコードの桁数に使われている領域だとわかります。

個人的な解釈としては、GR4はレコードに入力する10進数の数値なのですが、GR4をなぜ10倍すると2進数に変換されるのかなどやGR3の意味がわからないために全く理解できません。

よろしくお願いします。

このアセンブラのプログラムはIN命令によって3桁のレコードに入力された10進数の値を2進数に変換するプログラムです。

INPUT START                      (1)
RPUSH                      (2)
IN IBUF,ILEN ;レコードを入力       (3)
    LD GR0,ILEN                (4)
JMI FIN2 ;ファイルの終わり      (5)
LD GR1,=0   ;けた数のカウンタ  ...続きを読む

Aベストアンサー

2, 5, 3 という 3個の数字をこの順に読んだときに, あなたはどのようにしてこの数字の列が「253 という数値を表す」と理解しますか?

Qハンガーについての質問

ハンガーについていくつか質問があります
1.ハンガーはホームセンターに売っていますか?ほかにはどういうところに売っていますか?プラスチックのハンガー、針金にハンガーにつけるカバー、かわいいハンガーなど。
2.ハンガーにかけないほうがいいものってニット以外でありますか?だいたいアイロンをかけておいてハンガーにかけすぐに着たいのですが。

よろしくお願いします。

Aベストアンサー

1.通販などでも、結構かわいいのが売ってますよ。

2.ズボンは折り目が付いてるものをハンギングするときは、注意が必要です。

Q16進数の小数を10進数に変換する方法について

16進数の小数0.248を10進数の分数で表わすと73/512となりますが、
この答えの導き方についてです。

ある参考書に以下の説明がありました。

2×16×16+4×16+8
-------------------
  16×16×16

上記の分子に関して、なぜ2に16が2回乗算されているのか、
なぜ4に16が乗算されているのか理解できません。

分母になるはずの16がなぜ分子にあるのか??
という疑問を抱いております。

どなたか、上記の理由について、教えて頂けませんか?

Aベストアンサー

512自体を16のn乗のみであらわせないため 512より大きい最小の16のn乗は4096(16の3乗)になります

つまり分母が512を4096にします
分母を大きくするのですから分子も同様にしないとおかしくなります
分母を8倍にしたのですから分子も8倍にし584にします

584を16進で因数分解すると
2x16^2 + 4x16 + 8と分解できます

よって
2x16^2 + 4x16 + 8
-----------------
   16^3
といった表記になるのでしょう

2/16 + 4/256 + 8/4096 を4096で通分しています

QダイビングのBCDのポケットに携帯すべき物

ダイビングのBCDのポケットに携帯すべき物

今年Cカードを取得しました。ファンダイビングやバディ・ダイビングなどの際、BCDのポケットに皆さんは何を入れられていますか?

私は心配性で陸上でも「万が一」に備え色んなものをポーチにまとめて持ち歩いています。

BCDにシグナルフロート、飴(?)、反射鏡なども入れておきたいと思いますがシグナルフロートだけでも結構な重量になり皆さんはどうされているのだろうと疑問に思いました。
それに持っている人を見たことないですし・・・・
ナイフはBCDに付けています。

これだけは入れておきましょうというものがあれば教えてください。
よろしくお願いします。

Aベストアンサー

こんにちわ

私のBCのポケットにはマクスの曇り止めが入っています。
これはボートの上ですぐ使える為です。
それと同じ意味で加湿器の蓋をしめる為にコインが2~3枚入っています。

フロートは収納袋に入ったまま丁度BCとポケットの中間あたりにぶら下げています。
使った事はありませんがドリフトの度に確認をされ借りるのも面倒なのでつけっぱなしです。
あとは100均で買った虫眼鏡、濡れても書けるメモ帳が入っています。
先日確認したら鉛筆が折れて書けない状態だったですけどそのままです。
緊急時には、ガイドさんのスレートに書けば良いので多分?なくても大丈夫です。

あとカレントフック(ロープ付)が入っています。
流れがある時に引っかけてプカプカ浮いていると楽かと思います。
それと最初からBCのリングに笛がついています。
これも水上で使うのだと思いますが使った事はありません。   
私も飴とか食べ物は不要かなぁ~と思います。

Q100文字が並ぶテキストを10行10列にする方法(Bシェルにて)

100文字が並ぶテキストをBシェルにて10行10列にする方法を教えてください。
テキスト(test.txt)には、次のようにスペースで区切られて100文字入っています。(この例の様に規則性はありません)
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ..(省略)
↓これを
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
(省略)
の様にするやり方を教えてください。
Bシェル初心者です。宜しくお願い致します。

Aベストアンサー

手元にはbashしかないですが、たぶんこれでBシェルでも動くと思います。

set `cat test.txt`
while test "$1"
do echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
shift;shift;shift;shift;shift;shift;shift;shift;shift;shift
done


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング