No.4ベストアンサー
- 回答日時:
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
ご回答ご丁寧にありがとうございます。
まさに、こうゆうことを知りたかった!という感じです。
参考にがんばってみます。
ありがとうございました。
No.3
- 回答日時:
意図からすればビットフィールド構造体を使うのではどうでしょう?
struct dateset{
unsigned int year : 11;
unsigned int mon : 4;
unsigned int day : 5;
unsigned int hour : 5;
unsigned int min : 6;
};
これで32bit以内に収まっていますし。
No.1
- 回答日時:
Cの文字(Character)は、文字コードという数値で文字を
あらわします。
で、unsigned charという型は、0から255までの数値を入れることが出来ます。
ということは、2桁の数字なら余裕で入りますよね。
早速のご回答ありがとうございます。
おっしゃってることはわかるんですが。。
具体的に教えて頂けると助かります。
例えば、下記のような場合なら
どうすれば、変数sに変数strの値が入るのでしょうか?
char str[2] = "10";
unsigned char s;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 数学の質問です。 円に内接する四角形ABCD において, AB=2, BC = 1, CD = 3, 3 2023/04/18 18:28
- 数学 数学の質問です。 cos∠BCD=−1/6とします。 「∠BCD=θと置いて、cosθ=-1/6」 5 2023/04/19 18:27
- Windows 10 Windows10起動しない、エラー0xc0000185修復方法 2 2022/07/14 12:28
- 書道・茶道・華道 こないだ、イスラーム美術を展示するミュージアムに 2 2022/06/23 16:39
- その他(Microsoft Office) wordの差し込み印刷での日付表示 2 2023/08/15 16:51
- 数学 数学の質問です。 cos∠BCD=−1/6とします。 「∠BCD=θと置いて、cosθ=-1/6」 2 2023/04/19 18:17
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- 数学 行列式について。 行列式の問題(手計算でできるもの)の中には文字が含まれていて尚且つn次行列式になっ 3 2023/02/21 23:42
- HTML・CSS リンクバナーのHTMLタグ。画像を変えたり、設置位置を変えるとバナー貼付け側はどう見える? 2 2023/02/01 12:01
- 高校 対数方程式につきまして 4 2022/05/05 07:55
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
BCDについて
C言語・C++・C#
-
10進数をBCDに変換する方法
その他(プログラミング・Web制作)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
日付時刻を4バイトに
C言語・C++・C#
-
5
SerialPortのDataReceivedイベントについて
Visual Basic(VBA)
-
6
エクセルのデータグループ化の際に貼り付けた図だけ一緒に折りたたんでくれません!
Windows Vista・XP
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
DateTimePickerに値を入れたい...
-
String str = "a\\\\b\\\\c";
-
JSPでHashMap・配列の変数の値...
-
8桁整数を限りなく短い文字列に...
-
JSP内でfor文を使用し、出力結...
-
特定の文字列を複数抜き出した...
-
数値の出力
-
実行シェルからCOBOLへパラメー...
-
matchesを否定文として使う方法...
-
Javascriptでマシン固有の情報...
-
テキストボックスの数値チェック
-
【Excel VBA】繰り返し処理がで...
-
StringBuilderをStringに代入
-
DOSバッチで変数の値を変数名に...
-
VB.NET+Javascriptで、VB.NETで...
-
線形合同法(乗算型)による乱...
-
wsprintf関数の使い方について
-
Stringクラスの変数の格納アド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
ArrayListの要素数の上限
-
DateTimePickerに値を入れたい...
-
wsprintf関数の使い方について
-
Stringクラスの変数の格納アド...
-
BCD形式で時刻を!
-
javaのCSVデータ読込についてです
-
このプログラミング誰か教えて...
-
Evaluate()に文字列の形式の数...
-
このプログラミング誰か教えて...
-
JSPでHashMap・配列の変数の値...
-
特定の文字列を複数抜き出した...
-
matchesを否定文として使う方法...
-
DOSバッチで変数の値を変数名に...
-
Javaの問題なのですが、「3文字...
-
excel vba 時間計算と条件分岐...
-
実行シェルからCOBOLへパラメー...
-
日付や時刻の"01"を" 1"に変換...
-
VB6,論理演算子Orの使い方がわ...
-
char型での演算子
おすすめ情報