ホームページ >運用・保守 >Linuxの運用と保守 >Linux C言語にはビットがありますか?

Linux C言語にはビットがありますか?

藏色散人
藏色散人オリジナル
2023-03-28 10:57:511799ブラウズ

Linux C 言語にはビットがあります。マイコン C 言語では、ビットは新しいキーワードであり、「ビット変数」を定義するためによく使用されます。C 言語でビット型データを定義する方法は次のとおりです。 1. sbit を使用するまたはビット定義; 2. ビット フィールド (構造体内) を通じて定義; 3. 組み合わせたビット演算子を通じて定義。

Linux C言語にはビットがありますか?

#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。

Linux C 言語にはビットがありますか? #########持っている。

C 言語はビット型データを定義します:

1. sbit または bit による定義

sbit は IO ポート (P1 などの IO) にマッピングされます。 ^1 ポートの「ビット」)

bit は RAM のビットアドレス指定可能な空間にあり、通常はプログラム判定のためのフラグ ビットとして使用されます。

そのうちの 1 つは外部 (sbit)、もう 1 つは内部 (bit) であると考えてください。

マイクロコントローラー C 言語では、bit は新しいキーワードであり、「ビット変数」の定義によく使用されます

2. ビット フィールド (構造体内) を通じて定義します

定義ビット フィールドの説明とビット フィールド変数の説明 ビット フィールドの定義は構造体定義と似ており、その形式は次のとおりです:

struct ビット フィールド構造体名

{ビット フィールド リスト};

ビット フィールド リストの形式は次のとおりです: 型指定子ビット ドメイン名: ビット フィールド長

例:

struct bs 
{ 
 int a:8; 
 int b:2; 
 int c:6; 
};

ビット フィールド変数の説明は構造体の説明と同じです。変数。最初に定義してから説明することも、定義と説明を同時に行うことも、直接説明することもできます。例:

struct bs 
{ 
 int a:8; 
 int b:2; 
 int c:6; 
}data;

これは、データが bs 変数であり、合計 2 バイトを占めることを示します。ビットフィールド a は 8 ビット、ビットフィールド b は 2 ビット、ビットフィールド c は 6 ビットを占めます。ビット フィールドの定義については、いくつかの説明があります。

1. ビット フィールドは同じバイトに格納する必要があり、2 バイトにまたがることはできません。残りの 1 バイトのスペースが別のビット フィールドを格納するのに十分でない場合は、次のユニットからビット フィールドを格納する必要があります。意図的に次のユニットからビットフィールドを開始することもできます。例:

struct bs 
{ 
 unsigned a:4 
 unsigned :0 /*空域*/ 
 unsigned b:4 /*从下一单元开始存放*/ 
 unsigned c:4 
}

このビット フィールド定義では、a は最初のバイトの 4 ビットを占め、最後の 4 ビットを 0 で埋めて未使用を示します。b は 2 番目のバイトから始まり、4 ビットを占めます。 c は 4 ビットを占有します。

2. ビット フィールドは 2 バイトにまたがることができないため、ビット フィールドの長さは 1 バイトの長さを超えることはできません。つまり、2 進数の 8 ビットを超えることはできません。

3. ビットフィールドにはビットドメイン名を含めることはできませんが、現時点では位置を埋めるか調整するためにのみ使用されます。名前のないビットフィールドは使用できません。例:

struct k 
{ 
 int a:1 
 int :2 /*该2位不能使用*/ 
 int b:3 
 int c:2 
};

上記の分析から、ビット フィールドは本質的に構造体型ですが、そのメンバーはバイナリ形式で割り当てられていることがわかります。

2. ビット フィールドの使用法

ビット フィールドの使用法は、構造体メンバーの使用法と同じで、一般的な形式は次のとおりです: ビット フィールド変数名 • ビット ドメイン名 ビット フィールドで使用できるのは、次のとおりです。さまざまな形式で出力します。

main(){ 
 struct bs 
 { 
  unsigned a:1; 
  unsigned b:3; 
  unsigned c:4; 
 } bit,*PBit; 
 bit.a=1; 
 bit.b=7; 
 bit.c=15; 
 printf("%d,%d,%d\n",bit.a,bit.b,bit.c); 
 PBit=&bit; 
 PBit->a=0; 
 PBit->b&=3; 
 PBit->c|=1; 
 printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c); 
}

上記のプログラム例では、ビット フィールド構造体 bs を定義しており、3 つのビット フィールドは a、b、c で​​す。 bs型の変数bitとbs型を指すポインタ変数PBitについて説明します。これは、ビットフィールドでもポインターを使用できることを意味します。

プログラムの 9、10、11 行目では、3 つのビット フィールドにそれぞれ値を割り当てます。 (ビットフィールドの許容範囲を超えて代入することはできないことに注意してください) プログラムの 12 行目では、3 つのフィールドの内容を整数形式で出力します。 13行目では、ビットフィールド変数bitのアドレスをポインタ変数PBitに送信しています。 14 行目では、ポインタを使用してビット フィールド a を 0 に再割り当てします。行 15 は複合ビット演算子「&=」を使用しています。この行は次と同等です: PBit->b=PBit->b&3。ビット フィールド b の元の値は 7 で、ビットごとの AND 演算の結果は 3 です。は 3 (111&011=011、10 進数値は 3) です。同様に、プログラムの 16 行目で複合ビット演算「|=」が使用されています。これは PBit->c=PBit->c|1 と等価で、結果は 15 になります。プログラムの 17 行目では、ポインターを使用してこれら 3 つのフィールドの値を出力します。

ビット フィールドを使用する主な目的は、ストレージを圧縮することです。一般的な規則は次のとおりです:

1) 隣接するビット フィールドのタイプが同じで、ビット幅の合計が小さい場合type の sizeof サイズより大きい場合、次のフィールドは、収容できなくなるまで前のフィールドのすぐ隣に格納されます。

2) 隣接するビット フィールド フィールドの型が同じであるが、合計がビット幅が型の sizeof サイズより大きい場合、次のフィールドは、その型サイズの整数倍であるオフセットを持つ新しいストレージ ユニットから開始されます;

3) ビットフィールドの場合フィールドに非ビットフィールド フィールドが散在している場合、圧縮は実行されません;

4) 構造全体の合計サイズは、最も幅の広い基本型メンバーのサイズの整数倍です。

3. ビット演算子を組み合わせて操作する

#define Setbit(x,y)  (x|=(0x01<<y))   //置位
#define Clrbit(x,y)  (x&=(~(0x01<<y)))  //复位(清零)
#define Chkbit(x,y)  (x&(0x01<<y))     //检位

推奨学習: "

linux ビデオ チュートリアル

"

以上がLinux C言語にはビットがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。