概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C ビット演算子
2006年09月04日 (月) | 編集 |
今日の昼間は暑かった。久々にアイスなんぞを買って暑さに対処。
うちの会社にはクーラーなんて気の利いたモノは無いのだ。
たとえあっても9月が始まった以上、そう容易く使うとは思えないが。

その癖、夜は寒いくらい涼しいから性質が悪い。
まあ暑さで眠れないよりは全然問題無しOKだがよ。


ビット演算子とかいう、少し難しそうな演算の話だ。
2進数ってのが苦手なんだよなあどうにも。
数値を2進表現したときの、'1'または'0'の各ビットごとの演算を行う演算子らしい。
例えば16進数の0x1aを2進表現で書くと00011010となるが、ビット演算子は各々の桁にある、この1とか0とかの値をどうにかする演算子なわけだ。

いきなり難しそうな話になったな。

ビット演算の基本論理にはNOT、AND、OR、XORがあり、C言語ではそれぞれ~、&、|、^という演算子を用いるのだそうだ。


NOT
否定を意味し、aの値が0なら1に、aの値が1なら0にする。

a~a
01
10
こんなの

ビットの反転と呼ぶらしい。


AND
論理積を意味する。意味するとか言われても分からん。
端的に言うと両方とも1の時にのみ1にする。

aba&b
000
010
100
111
こんなの

特定のビットを強制的に0にする(マスクする)のによく使われるそうな。


OR
論理和を意味する。論理和とだけ言われても。
率直に述べるとどちらかが1であるなら1にする。ANDの逆だな。

aba|b
000
011
101
111
こんなの

ANDとは逆に、強制的に1にする(ビットを立てる)のによく使われるそうな。


XOR
排他的論理和を意味するらしい。これは俺も知らん。
どっちがが1なら1にするが、どちらも0である、もしくはどちらも1であるなら0にするようだ。ひねくれた論理演算だな。

aba|b
000
011
101
110
こんなの

これが何に使われるのかは入門書には書いていなかった。


これら4つの演算子は論理演算と呼ばれ、前述の通りビット演算の基本となるが、それ以外にもシフト演算というのがある。

<<
左シフトを意味する。
a<<bでaの各ビットを左へbビットだけずらす(シフト)させるのだそうだ。左端のずらされた分のビットは押し出されて無くなってしまう。また、空いた右端のビットには無くなった分、0が入る。

>>
右シフトを意味する。
こちらは逆にa>>bでaの各ビットを右にbビットだけシフトさせる。右端の押し出されたビットは無くなってしまうのは左シフトと同様なのだが、空いた左端に入るのがaが符号がない数なら0、符号がある数なら符号桁、というのが左シフトとは異なる。符号桁って何やねん。

やっぱりよく分からんので16ビットのパターンを表示する関数を見てみよう。

void bitpat(int x)
{
 int i;
 for(i=15;i>=0;i--)
  printf("%d",(x>>i) & 0x0001);
 printf("\n");
}

void main(void)
{
 int a;
 while (scanf("%d",&a)!=EOF)
  bitpat(a);
}


こんなのになる。

bitpat_test.jpgbitpat_test2.jpg

main文はまあ問題ないだろう。scanfで整数値を入力し、それをbitpat関数に渡している。これをデータの終わりとして^Zが入力されるまで繰り返す。それだけの話だ。

bitpat関数は整数値aを受け取って、for文でiが15から0になるまで16回(多分これが16ビットを意味するんだろうな)、(x>>i) & 0x0001を表示する。

意味分からん。何だこれ。
やってることは

xのビットを右に15個ずらして0x0001との論理積を取って表示、
xのビットを右に14個ずらして0x0001との論理積を取って表示、
xのビットを右に13個ずらして0x0001との論理積を取って表示、
以下略
xのビットを右に0個ずらして0x0001との論理積を取って表示する、


だけなのだが、これがどうしてこんな結果になるのかが分からない。

はて。

よく分からんので論理積外してx>>iだけでやってみた。

bitpat_test4.jpgbitpat_test3.jpg
益々分からなく




よし。


この疑問は経験を積んだ未来の俺に託そう。
とりあえず、

(x>>i) & 0x0001の16回ループで16ビットデータのビットパターンを表示出来る

と覚えておけば良し。
ほぼ思考停止だがここで延々と考え込んでいる暇はねーぜ。


まとめよう。

2進表現したときの0と1を扱うのがビット演算子だ
基本的な論理としてNOT、AND、OR、XOR等がある
(x>>i) & 0x0001で指定ビット数の2進表示?が出来る模様


以上。
今回の負債は大きそうだ。問題はビット演算子がどれだけ重要度高いか、だな。
後で同僚に聞いてみるとしよう。

スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。