ビット間の処理について

博士「ここをチェックじゃ」

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


困った顔のぷうさん

え~難しそう~。

ビット間の論理演算子

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

博士「Good!」

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の羅列で拒否反応がっ!!

その三 七日目まとめへ

七日目 数値アラカルト 目次

六日目へ

ぷうさんの七日間戦争 七日目

教科書