カレンダー

09月 │2017年10月│ 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

 プロフィール

はしもと

Author:はしもと
ユーザインタフェース系のお仕事をしてます.関心領域は画像処理,拡張現実感,ヒューマンコンピュータインタラクション,エンタテインメントコンピューティングあたり.モノ書きもやってます.

 工学ナビ

工学ナビは工学系の技術のチュートリアルを扱うサイトです.

 作ったもの

 Twitter

 

 天気予報


 ブログ内検索

 カテゴリー

最新コメント

 RSSフィード

 リンク

このブログをリンクに追加する




工学ナビの中の人 はしもとのブログです. いろんなコトを研究的,工学的な視点で見つめます.
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ビットフィールドって便利(C言語)
 学校ではあまり習わないC言語の技法にビットフィールドというものがあります.かくいう僕も去年EZ-USBのプログラミング中に初めて使ったほどでした.

 ビットフィールドはデータに対しビット単位でアクセスしたいときに便利なシロモノです.記述の仕方は構造体によく似ています.

ビットフィールドの良さがわかる簡単な例をお見せしましょう.
以下はビットフィールドを使って10進数(0~255)を2進数に変換するプログラムです.

#include <stdio.h>

// ビットフィールド
typedef struct tagBINARY {
unsigned int bit0 : 1;
unsigned int bit1 : 1;
unsigned int bit2 : 1;
unsigned int bit3 : 1;
unsigned int bit4 : 1;
unsigned int bit5 : 1;
unsigned int bit6 : 1;
unsigned int bit7 : 1;
} BINARY;

int main(void)
{
BINARY data;

printf("0~255の範囲で入力してください:");
scanf("%d",&data);

printf("%d%d%d%d",data.bit7, data.bit6, data.bit5, data.bit4);
printf("%d%d%d%d",data.bit3, data.bit2, data.bit1, data.bit0);
printf("\n");
return 0;
}


実行例
input=15
00001111

入力された1byteのデータをビット単位で解釈して表示するだけの単純なプログラムですが,
ややこしい計算をせずに実にシンプルです.

この仕組みはマイコンのプログラミングで非常に役立ちます.
マイコンは,一般的に8本の入出力端子(1ポート)の状態を,1byteの変数に格納された値で
表現しますので,ビットフィールドを使えばビットごとの入出力状態を容易に知ることができます.
これがまた超便利なんですヨ.


この記事に対するコメント

始めまして.コメントは初めてです.某高専の中の人です.
この方法だとSRAMがもったいなく無いですか?
最適化でなんとかなるのかな?
ちなみに,僕はマイコンを使う時は,以下のようなマクロを作っていますよ.
#define BitValue(bit) (1 << (bit))
#define Is_bit_set(data,bit) (data & BitValue((bit)))
#define Is_bit_clear(data,bit) !(data & BitValue((bit)))
#define Set_bit(data,bit) (data |= BitValue((bit)))
#define Clear_bit(data,bit) (data &=~ BitValue((bit)))
こうすれば,ポートの状態と,ビットを入れればわかりますよね.
今度使ってみてはいかがですか?
それにしても,ビットフィールドってこんな使い方があったんですね.
一生お付き合い無いと思っていました^^;
【2008/01/26 03:02】 URL | Hiro #F4rpFMc2 [ 編集]




この記事に対するコメントの投稿














管理者にだけ表示を許可する


この記事に対するトラックバック
トラックバックURL
→http://kougaku.blog28.fc2.com/tb.php/210-e81447c2
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。