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
    • 3
この回答へのお礼

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と関連する良く見られている質問

QExcelマクロでファイルを1つずつ選択する方法

先日こちらで、あるフォルダから10個のcsvファイルをまとめて選択し、そのデータをSheet1~10に順番に取り込むという方法を教えていただきました。
その時のものを一番最後に添付します(長くてすみません)。

これとは別に、1つずつ任意のファイルを選択して、あらかじめ用意しているシートにデータを取り込むということをしたいと思っています。
教えていただいた内容をもとに、いろいろいじっているのですが、なかなかうまくいきません。
どのようにすればいいのか、教えていただけないでしょうか。

<やりたいこと>
(1)デスクトップ上にあるフォルダ(フォルダ名:データ格納フォルダ)にあるcsvファイルを
選択できるダイアログボックスを表示する(ここで選択するファイルは1つ)。
(2) (1)で選んだファイルのデータを「Sheet1」に取り込む。
(3) 「Sheet1」のセルD2~D260までのデータを、同じブックにある「計算」シートのE4~E260にコピーする。

以降、
2つ目のcsvファイルを選択→「Sheet2」に取り込み→「Sheet2」のD2~D260までのデータを「計算」シートのK4~K260のセルにコピーする

3つ目のcsvファイルを選択→「Sheet3」に取り込み→「Sheet1」のD2~D260までのデータを「計算」シートのQ4~Q260のセルにコピーする

といった感じです。
ファイルの数は10個あり、10回繰り返します。
その際、データを取り込む際のシート(sheet1~sheet10)と、コピー先のセルがずれていきます。
(コピー元のセルの位置は変わりません。もしかすると、Sheet1~10を用意しなくても1つのシートで出来るのかもしれませんが…)

分かりづらいかと思いますが、どうか教えていただけないでしょうか。
よろしくお願いいたします。

先日教えていただいた内容:
----------------------------------------------------------------
Sub データ取り込み()

Dim FileList() As Variant, tmpName As Variant
Dim i As Integer

With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = True
.InitialFileName = Environ("userProfile") & "\desktop\k-db"
.Filters.Clear
.Filters.Add "CSVファイル", "*.csv"
.Filters.Add "すべてのファイル", "*.*"
.FilterIndex = 1

If CBool(.Show) Then
'選択ファイルのパスの格納
ReDim Preserve FileList(.SelectedItems.Count - 1)
For Each tmpName In .SelectedItems
FileList(i) = tmpName
i = i + 1
Next
Else
MsgBox "選択ファイルが無いので中止しました"
Exit Sub
End If
End With

For i = LBound(FileList) To UBound(FileList)
'Debug.Print FileList(i), i
Call 取り込みSheet(FileList(i), i + 1)
Next
End Sub

Private Sub 取り込みSheet(ByVal MyFileName As String, ByVal MyFileNo As Integer)
Worksheets("data" & CStr(MyFileNo)).Select
Range("A1").Select

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & MyFileName, Destination:=Range("$A$1"))
.Name = "cell" & CStr(MyFileNo) 'cell1~cell10 まで名前
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 932
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
------------------------------------------------------

先日こちらで、あるフォルダから10個のcsvファイルをまとめて選択し、そのデータをSheet1~10に順番に取り込むという方法を教えていただきました。
その時のものを一番最後に添付します(長くてすみません)。

これとは別に、1つずつ任意のファイルを選択して、あらかじめ用意しているシートにデータを取り込むということをしたいと思っています。
教えていただいた内容をもとに、いろいろいじっているのですが、なかなかうまくいきません。
どのようにすればいいのか、教えていただけないでしょうか。

<やりた...続きを読む

Aベストアンサー

Sub データ取り込み()内の
For i = LBound(FileList) To UBound(FileList)
を外して全体を10回ループ
取り込みSheet(FileList(i), i + 1)
の変数iを10回ループする変数に変更し、あとは、データのコピー部分だけを追加してやればいいだけだと思われますがダメなんでしょうか。

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などと書きます

QバイナリとBCDコード

2進法と2進化10進法の違いを簡略でいいので
教えてください!

懐かしき「2000年問題」の本を読んでいたら

BCDコードの場合

コンピュータの数値認識 
→ 99に1が足されて
  00(で一桁くりあがる)
→ 問題発生

バイナリ値の場合
→ 1999から2000年の変化はただ1増えるに過ぎない

と書いてありました。
できれば上記を踏まえて説明してくれると助かります!
わかりにくい質問かもしれませんがよろしくです。

Aベストアンサー

2進法とは(16進表現)
0,1,2,3,....8,9,A,B,C,D,F
10,11,12,13,.....18,19,1A,1B,1C,1D,1F
20,21,22,23,....

となっていきますが、整数の場合はよいですが、小数になると、2進数で表せない10進数が出てきます。このために、9のつぎは2進数でも10にするのです。

0,1,2,3,.......8,9
10,11,12,...18,19
20,21,22,...28,29
.........

COBOLなど金銭を取り扱うソフトはBCDを使ってあります。
C,C++などでもBCDを使えるようになっているようです。

10進数の0.1を10回足すと1.0になりますが、2進数ではなりません。0.1を2進数では表せないのです。普通、コンピュータの内部では2進計算ですから、

2進数では(カッコ内は10進数)
1を2で割ると・・・・・0.1(0.5)
0.1を2で割ると・・・・0.01(0.25)
0.01・・・・・・・・・・・・・0.001(0.125)
0.001・・・・・・・・・・・・0.0001(0.0625)
・・・・・・
10進数の0.1を2進数で表すことが出来ません。

FOR i=1 TO 20
  S=S+0.1
  IF S=1.0 THEN PRINT"OK"
NEXT i

このようなプログラムではOKは表示されません。

2000年問題は、メモリの節約のために、下2桁しか使用していなかったために、99に1を足して、100になる1のメモリがありませんから、下2桁の00しか表示されなくて、1900年と認識してしまうために、計算を間違ってしまうのでした、今年は9月問題がありますが、どうなるでしょうか?2001年9月8日問題です。gooで、キーワード「9月」で検索して見て下さい。

長くなりすぎました。後の方の補足を期待して!

2進法とは(16進表現)
0,1,2,3,....8,9,A,B,C,D,F
10,11,12,13,.....18,19,1A,1B,1C,1D,1F
20,21,22,23,....

となっていきますが、整数の場合はよいですが、小数になると、2進数で表せない10進数が出てきます。このために、9のつぎは2進数でも10にするのです。

0,1,2,3,.......8,9
10,11,12,...18,19
20,21,22,...28,29
.........

COBOLなど金銭を取り扱うソフトはBCDを使ってあります。
C,C++などでもBCDを使えるようになっているようです。

10進数の0.1を10回足すと1.0になりますが、2...続きを読む

QBCD・HEX・BINについて

設備のタッチパネルでBCD入力にて100をいれました。HEXに変換した値はいくらでしょうか?

Aベストアンサー

まず、2進と16進の表現方法はお分かりですね。乱暴な言い方をすれば、この2つは同じです。2進を4桁ずつ区切ったものが16進です。

さて、BCDですが、2進を4桁ずつ区切るまでは16進と同じですが、16進のAからFまでを使わない方法になります。つまり、9(=1001)に1を足した時、2進・16進の時は 1010 = A になりますが、BCD表現だと10000になります。2進数の考え方だと、1001の次が10000になりますので連続しないことになりますが、2進を下位から4桁ずつ区切ると、9の次が10と表現されるので、10進数だと思えば連続しているように見えます。

そこで、BCDで100を表現しようとすれば、1桁ずつ'1', '0', '0' をそれぞれ2進4桁で表現して、'0001' '0000' '0000' として、これを並べて 0001 0000 0000 がBCD表現となります。これを16進表現しても、4桁ずつ区切るわけですから"100"になります。

一方、10進数の100をを16進数で表現する場合、100 = 4 + 16×6 となりますから、16進数で64、2進数では 0110 0100 になります。つまり、10進数Xを16進表現するには、
X = k<0> + 16^1 × k<1> + 16^2 × k<2> + … + 16^n × k<n>
( 0 ≦ k<0>, k<1>, k<2>, … , k<n> ≦ 15 )
という k<0>…k<n> を見つけて、k<n>から並べていけばいいのです。具体的な計算方法は、Xを超えない16^nを見つけてXをそれで割ると商がk<n>になります。次にその割り算の余りを16^(n-1)で割ると商がk<n-1>、さらにその余りを16^(n-2)で割った商がk<n-2>、・・・と繰り返して、最後は16で割った商がk<1>余りがk<0>となります。

16^2 = 2^8 = 256, 16^3 = 2^12 = 4096, 16^4 = 2^16 = 65536

ぐらいは覚えておけば、なにかと役に立ちます。

まず、2進と16進の表現方法はお分かりですね。乱暴な言い方をすれば、この2つは同じです。2進を4桁ずつ区切ったものが16進です。

さて、BCDですが、2進を4桁ずつ区切るまでは16進と同じですが、16進のAからFまでを使わない方法になります。つまり、9(=1001)に1を足した時、2進・16進の時は 1010 = A になりますが、BCD表現だと10000になります。2進数の考え方だと、1001の次が10000になりますので連続しないことになりますが、2進を下位から4桁ずつ区切ると、9の次が10と表現されるので、10進数だと思えば連続...続きを読む

Q「0x00ff0000」?

多分ものすごく基本のことだと思うのですが、質問させてください…。

タイトルにもあるとおり、プログラムを勉強していたら画像処理のところで「0x00ff0000」などのような記述が出てきたのですが、これはどう読めばいいのでしょうか?

よろしくお願いします。

Aベストアンサー

『ゼロエックスゼロゼロエフエフゼロゼロゼロゼロ』ってことですか?
意味的には C言語などで使われる16進数表記です

0-9とA-Fまでの組み合わせで1桁で0から15までをカウントできます
0x0Aが10
0x0Fが15
0x10が16
0x100が256
といった具合です

画像処理なら RGBなどのデータをひとまとめに扱う際に
赤だけのデータが欲しいとか 緑だけのデータが欲しい
などの欲求があると思います
その際に マスクを掛けて希望のデータなどを取り出すためにご質問のようなデータを使います


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

人気Q&Aランキング

おすすめ情報