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

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

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

お礼日時: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
    • 4

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

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

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

このQ&Aを見た人が検索しているワード

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

QEXCELで10進数表記をBCD表示にしたい

あるソフトのCSVデータがあり、
その中に4664という数値があります。
実際この数値をBCDデータの1234と変換したいです。
変換後のデータは0000~9999までの4桁で、
元データもその範囲外のデータはありません。
関数を探しても、9桁以上のものは変換できないようです。
A1セルの数値をE10セルに表示できる方法を教えてください
変換途中で、他のセルで2進数に変換して、とかでもいいです。
マクロより、単に関数がいいです。
宜しくお願いします。

Aベストアンサー

E10セルに=DEC2HEX(A1, 4) と入力します

ちなみに4664は1238ではないでしょうか?

関数のヘルプです
10 進数を 16 進数に変換します。

この関数が使用できず、エラー値 #NAME? が返される場合は、分析ツール アドインを組み込む必要があります。

その方法は?
[ツール] メニューの [アドイン] をクリックします。[アドイン] の一覧の [分析ツール] チェック ボックスをオンにし、[OK] をクリックします。必要に応じて、セットアップ プログラムで表示される手順に従って操作します。
書式

DEC2HEX(数値,桁数)

数値 変換する 10 進の整数を指定します。数値に負の数を指定すると、桁数は無視され、10 桁 (40 ビット) の 16 進数が返されます。16 進数の最上位のビットは符号を表し、残りの 39 ビットは数値の大きさを表します。負の数は 2 の補数を使って表します。

桁数 16 進表記するときに使用する文字数 (桁数) を指定します。桁数を省略すると、必要最小限の桁数で結果が返されます。桁数を指定することによって、変換結果の先頭に 0 (ゼロ) を表示することができます。

解説

•数値 < -549,755,813,888 または数値 > 549,755,813,887 の場合、エラー値 #NUM! が返されます。
•数値に数値以外の値を指定すると、エラー値 #VALUE! が返されます。
•計算結果の桁数が指定した桁数の値よりも大きくなる場合、エラー値 #NUM! が返されます。
•桁数に整数以外の値を指定すると、小数点以下は切り捨てられます。
•桁数に数値以外の値を指定すると、エラー値 #VALUE! が返されます。
•桁数に負の数を指定すると、エラー値 #VALUE! が返されます。
使用例

使用例を新規のワークシートにコピーすると、計算結果を確認できます。

その方法は?

数式 説明 (計算結果)
=DEC2HEX(100, 4) 10 進数の 100 を 4 桁の 16 進数に変換します (0064)
=DEC2HEX(-54) 10 進数の -54 を 16 進数に変換します (FFFFFFFFCA)

E10セルに=DEC2HEX(A1, 4) と入力します

ちなみに4664は1238ではないでしょうか?

関数のヘルプです
10 進数を 16 進数に変換します。

この関数が使用できず、エラー値 #NAME? が返される場合は、分析ツール アドインを組み込む必要があります。

その方法は?
[ツール] メニューの [アドイン] をクリックします。[アドイン] の一覧の [分析ツール] チェック ボックスをオンにし、[OK] をクリックします。必要に応じて、セットアップ プログラムで表示される手順に従って操作します。
書式

DEC2HEX(数値,桁...続きを読む

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ビットに値を入れるか」についてですが、これは「シフト」を使えば簡単にできます。
...続きを読む

QBCDについて

バイナリーデータをBCD変換したいのですが、C言語でどのようにプログラムを組んだらいいのかわからないので、だれか教えてください。

Aベストアンサー

私はCはほとんどしたことがないのですが,機械語でそのようなプログラムを組む場合,10で割っていって余りを記録し,割られる数が0になるまで繰り返して組んだ記憶があります。アルゴリズムは言語が変わっても同じだと思います。
例)123をBCDに直す場合,
123÷10=12・・・3
12÷10=1・・・2
1÷10=0・・・1
これを逆に並べて「123」というBCDデータになりました。
もしかするとこの程度はCのライブラリにあるかもしれませんね。

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バイナリと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...続きを読む

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Q16進数から10進数への変換

16進数の77が16×14+7だということはわかるのですが、少し複雑になるとわからなくなります。
例えば以下のような場合です。

「16進数で5D2Cは
16の三乗×5+16の二乗×13+16×2+12
とあらわされます。」

なぜ、16の三乗や、16の二乗をする必要があるのでしょうか?

5桁になるとおそらく16の4乗をする必要がありそうですが、
宜しくお願いします。

Aベストアンサー

5桁で16の4乗、というのは正しいです。
この説明は下でされているので省きます。

16進数は数が大きいので、扱いが面倒、と思われるかもしれないので、
簡単な2進数への変換法を書いておきます。

16進数で5D2Cの場合
 1、各桁を2進数に変換する
 ⇒5D2C = 0101 | 1101 | 0010 | 1100
 2、変換したものをそのまま結合する
 ⇒ 0101 | 1101 | 0010 | 1100 ⇒  0101110100101100

 これで、2進数になります。
2のN乗の方が計算が楽だと思いますので、10進数にする場合は
使ってみてはいかがでしょうか?
(8進数の場合も同様にできます)

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。


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

人気Q&Aランキング