見出し画像

C言語で Java Silver レベルの問題を作ってみる No.26

 プログラミング言語って、しばらく触れてないと細かな部分を忘れてしまいますよね。また、複数のプログラミング言語を習得している人は、頭がこんがりますね。

 そんな方におススメしたいのが、資格試験の問題を1日5問程度解いていく方法です。毎日のスキマ時間を活用して短時間で知識レベルを維持することが出来ますよ。Javaならば、Silverの問題集が最適です。
 Silverを既に取得している人も、これから取得を目指している人もぜひ試してみてください。

 さて、この記事では、タイトルの通り、C言語をテーマにしています。
問題を毎日5問投稿していきますので、C言語を習得中の方、C言語の知識を維持されたい方は、ぜひご活用ください。


■ ビットフィールド

□ 1. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef struct {
    unsigned int x : 3;
    unsigned int y : 2;
} BitField;

int main(void) {
    BitField bf;
    bf.x = 7;
    bf.y = 5;

    printf("x: %d, y: %d\n", bf.x, bf.y);
    return 0;
}

A.     x: 7, y: 3
B.   x: 7, y: 1
C.  x: 7, y: 0  
D. x: 3, y: 3


□ 2. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef struct {
    unsigned int a : 4;
    unsigned int b : 4;
} BitField;

int main(void) {
    BitField bf;
    bf.a = 0b1010; // 10
    bf.b = 0b1100; // 12
    unsigned int result;

    result = bf.a & bf.b;
    printf("結果: %d\n", result);
    return 0;
}

A.  結果: 8
B.  結果: 4
C.  結果: 10
D.  結果: 0


3. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef struct {
    unsigned int x : 3;
    unsigned int y : 3;
} BitField;

int main(void) {
    BitField bf;
    bf.x = 0b011; // 3
    bf.y = 0b101; // 5
    unsigned int result;

    result = bf.x | bf.y;
    printf("結果: %d\n", result);
    return 0;
}

A.    結果: 3
B. 結果: 5
C. 結果: 6
D. 結果: 7


□ 4. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef struct {
    unsigned int a : 3;
    unsigned int b : 3;
} BitField;

void print_bits(unsigned int value, int bits) {
    for (int i = bits - 1; i >= 0; i--) {
        printf("%d", (value >> i) & 1);
    }
    printf("\n");
}

int main(void) {
    BitField bf;
    bf.a = 5;
    bf.b = 6;

    printf("a: ");
    print_bits(bf.a, 3);
    printf("b: ");
    print_bits(bf.b, 3);

    return 0;
}

A.    a: 101
       b: 110
B. a: 111
    b: 110
C. a: 101
  b: 100
D. a: 110
  b: 101


□ 5. 次のプログラムをコンパイルし、実行したときの出力結果として、正しいものを選びなさい。(1つ選択)

#include <stdio.h>

typedef struct {
    unsigned char b0 : 1;
    unsigned char b1 : 1;
    unsigned char b2 : 1;
    unsigned char b3 : 1;
    unsigned char b4 : 1;
    unsigned char b5 : 1;
    unsigned char b6 : 1;
    unsigned char b7 : 1;
} Bit;

typedef union {
    unsigned char byte;
    Bit bit;
} Port;

int main(void) {
    Port p;
    p.byte = 0xAC;

    printf("ビット単位での表示: ");
    printf("%d%d%d%d%d%d%d%d\n",
           p.bit.b7, p.bit.b6, p.bit.b5, p.bit.b4,
           p.bit.b3, p.bit.b2, p.bit.b1, p.bit.b0);

    return 0;
}

A.   01011011
B.   11001010
C.   00101100
D.   10101100


解答

1.B

BitFieldという構造体には、2つのビットフィールドメンバがあります。unsigned int x : 3:3ビットでxを保持する。
unsigned int y : 2:2ビットでyを保持する。

次に、main関数では以下の操作を行います。
bf.x = 7;
xは3ビットであるため、7(2進数では111)はそのまま保持されます。
したがって、xは7です。
bf.y = 5;
yは2ビットであるため、5(2進数では101)を代入しようとします。
しかし、2ビットでは5を表現できません(5は3ビット必要です)。2ビットに収まるのは0から3までの値のみです。
5の2進数表現101の上位ビットは切り捨てられ、下位2ビットである01がyに代入されます。
したがって、yの値は1になります。
最後に、printf("x: %d, y: %d\n", bf.x, bf.y);によって出力される値は、x: 7, y: 1です。

2.A

BitField という構造体が定義されています。この構造体には a と b の2つのフィールドがあり、それぞれ4ビット幅を持つ unsigned int 型のビットフィールドです。

bf.a に 0b1010(2進数で 1010、10進数で 10)を代入しています。
bf.b に 0b1100(2進数で 1100、10進数で 12)を代入しています。

bf.a と bf.b のビットごとの論理積を求め、result に代入しています。
bf.a は 1010 で、bf.b は 1100 です。
ビットごとの論理積(AND)演算を行うと、次のようになります:

   1010
   1100
 --------
& 1000

結果は `1000` で、これは10進数で `8` になります。

3.D

BitField という構造体を定義しています。
この構造体には x と y というフィールドがあり、それぞれ3ビットの幅を持つ unsigned int 型のビットフィールドです。

bf.x に 0b011(2進数で 011、10進数で 3)を代入しています。
bf.y に 0b101(2進数で 101、10進数で 5)を代入しています。

bf.x と bf.y のビットごとの論理和(OR)を求めて、result に代入しています。
bf.x は 011 で、bf.y は 101 です。
ビットごとの論理和を行うと次のようになります:

  011
  101
------
| 111

結果は `111` で、これは10進数で `7` になります。


4.A

BitField という構造体を定義しています。
構造体には3ビットのビットフィールド a と b があります。
ビットフィールドの幅は3ビットで、それぞれ0から7の範囲の値を保持できます。

print_bits 関数は与えられた数値のビットを上位ビットから順に出力します。
value >> i により、value を i ビット右シフトし、& 1 でそのビットが0か1かを取得しています。
これによって、bits で指定されたビット数の2進数表現を出力しています。

main関数では、
bf.a に 5 を代入し、bf.b に 6 を代入しています。
3ビットの範囲でそれぞれ値を保持します。
print_bits 関数を使って bf.a と bf.b の2進数表現を3ビットで出力します。


5.D

Bit という名前の構造体を定義しています。
この構造体には b0 から b7 までの8つのビットフィールドがあり、各フィールドは1ビットで構成されています。
これにより、8ビットを個別にアクセスできるようにしています。

Port という名前の union を定義しています。
この union には、1バイトの unsigned char と、ビットフィールドの Bit 構造体の2つのメンバーがあります。
union を使用することで、1バイトのデータ (byte) と、ビットごとのデータ (bit) を同じメモリ領域に格納します。

main関数では、
Port 型の変数 p を宣言し、p.byte に 0xAC(16進数)を代入しています。
0xAC は2進数で 10101100 です。
ビットフィールドを使って、p.bit の各ビットを b7 から b0 まで出力しています。
b7 が最上位ビットで、b0 が最下位ビットになります。

0xAC を2進数に変換すると 10101100 になります。
ビットの配置は次のようになります:
b7 = 1
b6 = 0
b5 = 1
b4 = 0
b3 = 1
b2 = 1
b1 = 0
b0 = 0
出力結果
ビットの順に出力すると、10101100 となります。



本日の学習内容

お疲れ様でした。
継続は力なりです。
明日も頑張りましょう!

この記事が気に入ったらサポートをしてみませんか?