ここからはちょっと内容が難しくなると思いますが、頑張っていきましょう。

F.ビット論理演算子


通常使うデータはバイト(*)単位で扱いますが、バイトの中のビット(*)単位の論理演算を行いたいような場合にはこのビット演算子を用います。

式1 ビット論理演算子 式2  (論理積、論理和、排他的論理和)
ビット論理演算子 式     (1の補数)


演算子意味計算値(ビット毎)
 &論理積a & b(a と b の対応するビットが)ともに 1 なら 1、それ以外は 0
 |論理和a | b(a と b の対応するビットが)少なくとも一方が 1 なら 1、それ以外は 0
 ^排他的論理和a ^ b(a と b の対応するビットが)等しければ 1、それ以外は 0
 ~1 の補数~aそのビットが 1 ならば 0、0 ならば 1

[ 例 ] ビット論理演算子の使用例  ex3-3.cGet! ソースファイル
short dat1, dat2, ret1, ret2, ret3, ret4;  /* short 型 (2 バイト) で変数を宣言 */
 
/* 変数に値を代入(括弧の中は 2 進数で表記したもの) */
dat1 = 212;/* dat1 = 212 (0000 0000 1101 0100) */
dat2 = -45;/* dat2 = -45 (1111 1111 1101 0011) */
ret1 = dat1 & dat2;/* ret1 = 208 (0000 0000 1101 0000) */
ret2 = dat1 | dat2;/* ret2 = -41 (1111 1111 1101 0111) */
ret3 = dat1 ^ dat2;/* ret3 = -249 (1111 1111 0000 0111) */
ret4 = ~ dat1;/* ret4 = -213 (1111 1111 0010 1011) */

G.シフト演算子


シフト演算子はビット列を左右に指定のビット数だけずらす(シフトする)ために使います。

式1 シフト演算子 式2

演算子意味計算値
 >>右シフトa >> ba を b ビット右にシフトした値
空になったビットの値は、a の型が
 符号付きデータ ( signed ) → MSB(*) の値 <算術シフト>
 符号無しデータ ( unsigned ) → 0 <論理シフト>
 <<左シフトa << ba を b ビット左にシフトした値
空になったビットの値は、0

[ 例 ] シフト演算子の使用例  ex3-4.cGet! ソースファイル
short dat1;       /* short 型(符号付き)で dat1 を宣言 */
unsigned short dat2;  /* unsigned short 型(符号なし)で dat2 を宣言 */

dat1 = 0xffff;  /* dat1 にFFFFH を代入 */
dat2 = 0xffff;  /* dat2 にFFFFH を代入 */
dat1 = dat1 << 4;  /* 左に 4ビットシフト → dat1 = FFF0H */
dat1 = dat1 >> 4;  /* 右に 4ビットシフト → dat1 = FFFFH */
dat2 = dat2 << 4;  /* 左に 4ビットシフト → dat2 = FFF0H */
dat2 = dat2 >> 4;  /* 右に 4ビットシフト → dat2 = 0FFFH */

シフトの様子

H.複合演算子


これは代入演算で右辺の式の中に左辺の識別子を含む場合にこの演算子を使って式を記述出来ます。
これだけだとよく分からないでしょうが、下の表を見れば分かると思います。

識別子 複合代入演算子 式

演算子使用例同じ意味の式
 +=n1 += n2n1 = n1 + n2
 -=n1 -= n2n1 = n1 - n2
 *=n1 *= n2n1 = n1 * n2
 /=n1 /= n2n1 = n1 / n2
 %=n1 %= n2n1 = n1 % n2
 &=n1 &= n2n1 = n1 & n2
 |=n1 |= n2n1 = n1 | n2
 ^=n1 ^= n2n1 = n1 ^ n2
 >>=n1 >>= n2n1 = n1 >> n2
 <<=n1 <<= n2n1 = n1 << n2

つまり、n1 の値を 10 増やしたければ n1 += 10 とすればいいわけです。
初めは慣れないかも知れませんが、使い始めると非常に便利な演算子です。

2.演算子の優先順位と結合規則 - Priority and Combination -


演算子には「優先順位」があり、優先順位の高い順番に演算子が評価されるようになっています。
優先順位が同じ場合は右から左方向に演算するか、左から右方向に演算するかを決定する「結合規則」が適用され、結合規則の順に評価します。
下の表が演算子の優先順位、結合規則をまとめたものです。

優先順位演算子結合規則

1 () [] . -> ++(後置形式) --(後置形式)
2 ++(前置形式) --(前置形式) & *(間接参照)
 +(プラス符号) -(マイナス符号) ! ~ sizeof
3 (キャスト)
4 *(乗算) / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 &
10 ^
11 |
12 &&
13 ||
14 ?:
15 = += -= *= /= %= <<= >>=
 &= |= ^=
16 ,
 表中の←は右から左、→は左から右の意味

[ 例 ] 演算子の優先順位と結合規則  ex3-5.cGet! ソースファイル
int a, b, c;/* 変数の宣言 */
a = 4 * 2 - 8 / 4;/* a = (4 * 2) - (8 / 4); と同じ */
/* a = 6 */
b = c = 0;/* b = (c = 0); と同じ */
/* b = 0, c = 0 */

表の中にはこの章では説明していない演算子ものっています。それらの演算子は後々別の章で説明します。


○ソースファイルのダウンロード○
この章に使った例のソースファイルを1つにまとめて圧縮してあります。
 【中に含まれているソースファイル】 ex3-1.c ex3-2.c ex3-3.c ex3-4.c ex3-5.c

ソースファイルのダウンロードexample03.lzh ( 2.0kBytes )


Jump to Phase #03-1Phase #03-1: 式と演算子(1) へ
Phase #04-1: 制御文(1) へJump to Phase #04-1

△戻る
▲トップに戻る