Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

Cのビットフィールド


このセクションでは、Cのビットフィールドとは何かを説明します。

次のように、Cプログラムにstatusという構造にグループ化された多数のTRUE /FALSE変数が含まれているとします–

struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status;

この構造には8ビットのメモリスペースが必要ですが、実際には、各変数に0または1を格納します。 Cプログラミング言語は、そのような状況でメモリ空間を利用するためのより良い方法を提供します。

構造内でこのような変数を使用している場合は、変数の幅を定義して、それらのビット数のみを使用することをCコンパイラに通知できます。たとえば、上記の構造は次のように書き直すことができます-

struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status;

上記の構造では、ステータス変数用に4ビットのメモリスペースが必要ですが、値を格納するために使用されるのは2ビットのみです。

それぞれが1ビットの幅で最大32個の変数を使用する場合、ステータス構造も4ビットを使用します。ただし、33個の変数があるとすぐに、メモリの次のスロットが割り当てられ、8ビットの使用が開始されます。次の例をチェックして、概念を理解しましょう-

サンプルコード

#include <stdio.h>
#include <string.h>
/* define simple structure */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;
/* define a structure with bit fields */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;
int main( ) {
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
   return 0;
}

出力

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

ビットフィールド宣言:

ビットフィールドの宣言は、構造内で次の形式になります-

struct {
   type [member_name] : width ;
};

次の表で、ビットフィールドの可変要素を説明します-

要素 説明
タイプ ビットフィールドの値がどのように解釈されるかを決定する整数型。タイプは、int、signed int、またはunsignedintのいずれかです。
member_name ビットフィールドの名前。
ビットフィールドのビット数。幅は、指定されたタイプのビット幅以下である必要があります。

事前定義された幅で定義された変数は、ビットフィールドと呼ばれます。ビットフィールドは、複数のビットを保持できます。たとえば、0〜7の値を格納する変数が必要な場合は、次のように3ビット幅のビットフィールドを定義できます-

struct {
   unsigned int age : 3;
} Age;

上記の構造体定義は、age変数が値を格納するために3ビットのみを使用することをCコンパイラーに指示します。 3ビットを超えて使用しようとすると、使用できなくなります。次の例を試してみましょう–

サンプルコード

#include <stdio.h>
#include <string.h>
struct {
   unsigned int age : 3;
} Age;
int main( ) {
   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );
   Age.age = 7;
   printf( "Age.age : %d\n", Age.age );
   Age.age = 8;
   printf( "Age.age : %d\n", Age.age );
   return 0;
}

出力

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

  1. Cの配列内の範囲の積

    配列、L、R、Pを入力として指定し、タスクは、モジュロの下の積を出力としてLとRの間の範囲を見つけ、それを表示することです。 図に示されているように、要素の配列と、2としての左の値であるLと2としての右の値であるRがあります。ここで、プログラムはそれらの間の範囲の積を見つける必要があります。 例 Input-:  A[] = { 1, 2, 3, 4, 5, 6 }    P = 29  L = 2 R = 6 Output-: 24 Input-: A[] = {1, 2, 3, 4, 5, 6},    L =

  2. C /C++の多次元配列

    C / C ++では、多次元配列は簡単な言葉で配列の配列として定義されます。多次元配列では、データは表形式で(行の主要な順序で)格納されます。次の図は、次元が3 x 3x3の多次元配列のメモリ割り当て戦略を示しています。 アルゴリズム Begin    Declare dimension of the array.    Dynamic allocate 2D array a[][] using new.    Fill the array with the elements.    Print the ar