質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1532閲覧

万年カレンダ 祝日マークの表示

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/15 00:22

C言語についての質問になります。

現在万年カレンダを作成しておりましてteratailの過去の質問などを参考にしていたのですがわからない、理解できない箇所がございましたので質問いたします。

祝日のマークを出力する際ですが、

#define BIRTH_MARK 0x80 // 誕生日 #define TRANS_MARK 0x40 // 振替祝日 #define HOLI_MARK 0x20 // 祝日 ///////カレンダを作る//////// if (week > TUE) { if (calendar[month][row][week] & HOLI_MARK && calendar[month][row][week - 2] & HOLI_MARK) { calendar[month][row][week - 1] |= HOLI_MARK; ///カレンダを表示する printf("%2d ", calendar[month][row][col] & 0x1F);

上記コードのカレンダを作るの& HOLI_MARK、カレンダを表示するの& 0x1Fは何を行っているものか教えていただけませんでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

演算子がどういう動作を行うのかを理解しましょう

calendar[month][row][week] & HOLI_MARK

HOLI_MARKがセットされていれば、0以外、そうでなければ0を返します

calendar[month][row][col] & 0x1F

0x1f とandされた数値を返します

投稿2020/06/15 00:39

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/15 04:18

y_waiwai様 少し混乱しましたがおっしゃっている意味が理解できました! ありがとうございます!
guest

0

ベストアンサー

類似の質問を見たところ、calendar配列は以下のようなビット構成になっているようです。

7ビット目:誕生日ビット
6ビット目:振替祝日ビット
5ビット目:祝日ビット
4~0ビット目:日付ビット

つまり31日を表すと31(10進数)=1F(16進数)=11111(2進数)になります。
これに誕生日を追加すると10011111(2進数)になりますし、
振替を追加すると1011111(2進数)になりますし、
祝日を追加すると111111(2進数)になります。
全部追加すると11111111(2進数)になりますね。

という知識を得たところで、この行が何をやっているかです。

c

1printf("%2d ", calendar[month][row][col] & 0x1F);

16進数の1Fつまり2進数で11111とAND演算をしています。
元の値が11111111だった場合、11111とANDすると下位5ビットのみが得られます。

11111111 00011111 -------- 00011111

つまりこの処理では下位5ビットに入っている日付を表す数値を得ていることになります。

投稿2020/06/15 01:56

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/15 04:22

ttyp03様 類似の質問まで見に行っていただき感謝いたします! 説明とても分かりやすく理解できました! ベストアンサーとさせていただきます、またご縁があればご教授お願い致します!
guest

0

ビット演算子です。
HOLI_MARKおよび同様に入っているであろうBIRTH_MARKTRANS_MARKを取り除くため、& 0x1Fで下位5bitを得ています。

& HOLI_MARKHOLI_MARKのビットが立っているかを確認しています。

投稿2020/06/15 00:37

編集2020/06/15 00:41
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/15 04:20

SHOMI様 0x1fは下位5ビットを得ているということが説明のおかげで理解できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問