論理演算の使い道メモ

左シフトやら右シフトすれば bit 変換 ( 記事最後のヤツ ) できるのか疑問だったので調べた。
コピペ。

 

ビット数が違うデータ同士の計算

 10 bit と 12 bit で出力された同値の数を int 型変数 16 bit に入れると、
以下のようになる。|| は論理和ではなくただ区切りの記号。

値:0
10 bit  ||  12 bit
0000  0000  0000  0000  ||  0000  0000  0000  0000

値:3.3
10 bit  ||  12 bit
0000  0011  1111  1111  ||  0000  1111  1111  1111

互いに計算させたい時は、
10 bit の方を値を 左に 2 ビットシフトするか、
12 bit の方の値を 右に 2 ビットシフトすれば近似計算が出来る。

 

特定の値を取り出したい

端子にスイッチを付けて、ON か OFF を判定したい。

例えば、16 本の端子の中で 0 番端子が ON か OFF かを判定したい時。
※ 0 以外はスイッチが付いているか ON なのか OFF なのか不明

0 番端子のビットを 1 にした値と AND を取る。
AND論理積両方が true なら ture。両方 1 なら 1 。片方が 0 なら 0。

????  ????  ????  ???1

0000  0000  0000  0001
AND 計算する。

AND は 両方 1 でないと 1 にならないので、? の部分は強制的に 0 になる。
このような演算はマスクという。

 

特定のビットだけを操作したい

特定のビットだけ強制的に 0 または 1 にしたい場合。

x の部分を強制的に 0 にしたい。
???  ??x?  ????  ????

これは下記と AND をとる。
1111  1101  1111  1111  (マスク

マスクの 1 の部分は元が1 なら1 、0 なら 0 になる。
つまり元を維持できる。0 の部分は強制的に 1 になる。

 

逆に、x の部分を強制的に 1 にしたいときは、
0000  0010  0000  0000  (マスク
と OR を取ると出来る。

マスクの 0 の部分は元が 1 なら 1 、0 なら 0 になる。
1 の部分は OR なので強制的に 1 に。

  

 変数のビット幅が違う場合の変換

通信が 8 ビット単位なのに 16 ビットの値を扱いたい時など。

ex ) 16 ビットデータを 8 ビットで扱いたい。
16 ビットのデータを 2 つの 8 ビットデータに分割する。

    int a;
    char b1,b2;
    a = 0x2F3C;
    b1 = ( char )( a & 0x00FF );
    b2 = ( char )( a >> 8 );

a の16 ビットデータを b1b2 に分割している。
int は 16 ビット型の変数宣言、char は 8ビット型の変数宣言。

4 行目、a & 0x00FF で、下位 8 ビットを抽出している。
0x00FFは 2 進数に直すと 0000  0000  1111  1111 。下位 8 ビットがマスクされる。
( char ) は、計算結果を char に無理やり変換している。
大きい型小さい型変換すると、上位ビットはなくなる
故に、下位 8 ビットが b1 に入る。

a >> 8 で、上位 8 ビット下位 8 ビットへ移動し、
( char ) の型変換で上位 8ビットカットしている。

 

 

 

こちらから。
http://www.robotsfx.com/robot/robohow/RoboHow100/RoboHow100.html

以上。