ビット間の処理について

ラストはビット間の処理についてじゃ。

え~難しそう~。
ビット間の論理演算子
- 「|」
- 論理和(OR)
対応するビットがどちらか一方でも1なら1になる。
例)a=data | 0xff00 - 「&」
- 論理積(AND)
対応するピットが両方とも1なら1になる。
例)a=data & 0xff00 - 「^」
- 排他的論理和(XOR)
対応するビットが異なれば1になる。
例)a=data ^ 0xff00 - 「~」
- 論理否定(NOT)
0なら1、1なら0になる(ビットを反転する)。
例)a ~ data

if文の条件式で使うのじゃぞ。

・・・前にif文の条件式でやらなかったっけ!?

三日目・その二 C言語らしい書き方「if文の書き方」じゃな。
その中の論理積「&&」と論理和「||」じゃ。
今回のも前回のも論理演算子じゃが、二つ並べて記載したものは通常時に使用。
今回の様に一つだけ記載したばあいはビット間で比べる場合に使用するのじゃ。

・・・こんがらがりそう・・・。
シフト演算子
- <<
- 左シフト
指定されただけピットを左にずらす。
Nピット左にシフトすると2のN乗をかけた値になる。
例)a=data << 8 - >>
- 右シフト
指定されただけピットを右にずらす。
Nピット左にシフトすると2のN乗で割った値になる。
例)a=data >> 8

こちらはデータをビット単位でいじるのじゃ。

こっちはまだ分かりやすいね。
ビット演算プログラム

論理演算子とシフト演算子を実際に使ってみるかの。
#include <stdio.h> void vitcrt (int a); main() { int data=0x00a5; int a; printf("data:");bitcrt(data); a=data | 0x000f; //論理和 printf("or :");bitcrt(a); a=data & 0x000f; //論理積 printf("and :");bitcrt(a); a=data ^ 0x000f; //排他的論理和 printf("xor :");bitcrt(a); a=data ~; //論理否定 printf("not :");bitcrt(a); //左へ2ビットシフト(4倍) a=data<<2; printf("<<2 :");bitcrt(a); //右へ2ビットシフト(1/4倍) a=data>>2; printf(">>2 :");bitcrt(a); } void bitcrt (int a) { int i; //符号なしint型 unsigned int mask = 0x8000; for (i=0;i<16;i++){ //1かどうかのチェック if (a & mask) { printf("1"); } else { printf("0"); } mask=nask>>1; ///右へシフト } printf("(%4x)(%6d)/n",a,a); }
説明文
実行結果
data:0000000010100101( a5)( 165) or :0000000010101111( af)( 175) and :0000000010100101( 5)( 5) xor :0000000010101010( aa)( 170) not :1111111101011010(ff5a)( -166) <<2 :0000001010010100( 294)( 660) >>2 :0000000000101001( 29)( 41)

1と0の羅列で拒否反応がっ!!