4週目:ビット演算子[全体PDF]

今週の目標

ユーザが指定した画像ファイルを読み込み,減色または上下反転させて別ファイルとして出力する


図1 4週目の目標

モジュール設計[PDF]

作業課題

プログラムのモジュール化のため,以下の通り別々のファイルで関数等を定義するよう修正せよ.

  • main.c
    • ヘッダファイルのインクルード
    • main関数
  • img_io.c,img_io.h
    • PIXEL構造体およびIMAGE構造体の定義
    • iioLoadFile関数
    • iioSaveFile関数
    • iioMallocImageBuffer関数
    • iioFreeImageBuffer関数
  • img_proc.c, img_proc.h
    • ipCopy関数
    • その他の画像処理関数

ビット演算を利用した減色処理[PDF]

ビット演算

ビット演算子とは,整数型の数値 (char, short, int, long) に対してビット単位で演算を行うための演算子である. 整数であればsigned(符号付き)でもunsigned(符号なし)でも適用できる.

C言語で用意されているビット演算子は以下の6つである.

演算子 名称
& ビットごとのAND演算子 ※1
| ビットごとのOR演算子 ※1
^ ビットごとの排他的OR演算子 (XOR)
対応するビットが異なるときには1,同じときには0がセットされる.
<< 左シフト
空になる下位ビットには0が入る.
>> 右シフト
空になる上位ビットには0が入る.※2
~ 1の補数演算子 (単項演算子)
ビットを反転する.

※1論理演算子の && や || とは違う点に注意する.
※2符号付き数の場合,多くの処理系では空になる上位ビットに符号ビットが入る.

また,算術演算子(+,-,*,/)と同様に,複合代入演算の形(&=, |=, >>= など)も利用できる.

下の表に具体例を挙げる.ここで,変数A,B,C,Dの型と初期値は以下の通りとする.

unsigned char A = 113; (16進 0x71, 2進 0111 0001)
unsigned char B = 15; (16進 0x0F, 2進 0000 1111)
char C = -64; (16進 0xC0, 2進 1100 0000)
char D = 0;

結果 (カッコ内は16進表記と10表記)
D = A & B
A: 0111 0001
B: 0000 1111
D: 0000 0001 (0x01,1)
D = A | B
A: 0111 0001
B: 0000 1111
D: 0111 1111 (0x7F,127)
D = A ^ B
A: 0111 0001
B: 0000 1111
D: 0111 1110 (0x7E,126)
D = B << 2
B: 0000 1111
D: 0011 1100 (0x3C,60)
2ビット左シフトすると4倍になる
D = A >> 3
A: 0111 0001
D: 0000 1110 (0x0E,14)
3ビット右シフトすると8分の1になる
D = C >> 3
C: 1100 0000
D: 1111 1000 (0xF8,-8)
負の数の右シフトは,空となる上位ビットにシフト前の符号ビット(最上位ビット)が入る
(visual studio, gccで確認)
D = ~A
A: 0111 0001
D: 1000 1110 (0x8E,-114)
A >>= 2
複合代入演算の例
A: 0111 0001←式の実行前
A: 0001 1100←式の実行後

演習課題4_4_1

入力画像の各画素の下位nビットを0でマスクすることで,減色画像を作成せよ. ただし,nは(自身の学籍番号の下一桁 % 7) + 1 とし,減色処理はipBitMask関数として実装すること.

レポートに向けた補足

最終レポートの作成に役立つ知識

その他の画像処理の補足解説

レポート課題[PDF]

レポートについて