CASL U - ビットの操作
 前へ 目次へ 次へ

ビットの操作

 ビット操作とは、特定のひとつのビットあるいは複数のビットに対して、0や1に設定する操作、0か1かを調べる操作などビット単位で行う処理のことである。


(1) 特定のビットにデータを設定する

 特定のビットだけを0または1にする。そのほかのビットはそのまま変化させない。

設定するデータ 演算データ 演算
0 特定ビットが0、そのほかは1 AND演算
1 特定ビットが1、そのほかは0 OR演算

例題a データ #0FF0(0000 1111 1111 0000)の第7ビットだけを 0 にする。

 必要な演算データは #FF7F(1111 1111 0111 1111,  第7ビットだけが0)である。

      0000 1111 1111 0000(2)
 AND  1111 1111 0111 1111(2)
      0000 1111 0111 0000(2)    →  #0F70

例題b データ #0F0F(0000 1111 0000 1111)の第4,6,8,10ビットを 0 にする。

 必要な演算データは #FAAF(1111 1010 1010 1111)である。

      0000 1111 0000 1111(2)
 AND  1111 1010 1010 1111(2)
      0000 1010 0000 1111(2)    →  #0A0F
例題a 例題b
REIA     START
         LD      GR0, DATA
         AND     GR0, =#FF7F
         ST      GR0, ANS
         RET
DATA     DC      #0FF0
ANS      DS      1
         END
MAINB    START
         LD      GR0, DATA
         AND     GR0, =#FAAF
         ST      GR0, ANS
         RET
DATA     DC      #0F0F
ANS      DS      1
         END

例題c データ #0FF0(0000 1111 1111 0000)の第12ビットだけを 1 にする。

 必要な演算データは #1000(0001 0000 0000 0000,  第12ビットだけが1)である。

     0000 1111 1111 0000(2)
 OR  0001 0000 0000 0000(2)
     0001 1111 1111 0000(2)    →  #1F70

例題d データ #0F0F(0000 1111 0000 1111)の第4,6,8,10ビットを 1 にする。

 必要な演算データは #0550(0000 0101 0101 0000)である。

     0000 1111 0000 1111(2)
 OR  0000 0101 0101 0000(2)
     0000 1111 0101 1111(2)    →  #0F5F
例題c 例題d
MAINC    START
         LD      GR0, DATA
         OR      GR0, =#1000
         ST      GR0, ANS
         RET
DATA     DC      #0FF0
ANS      DS      1
         END
MAIND    START
         LD      GR0, DATA
         OR      GR0, =#0550
         ST      GR0, ANS
         RET
DATA     DC      #0F0F
ANS      DS      1
         END


(2) 特定のビットを調べる

 特定のビットが0かどうか、または1かどうかを調べる。

調べるデータ 演算データ 演算
0 特定ビットが0、そのほかは1 OR演算、CPL演算
1 特定ビットが1、そのほかは0 AND演算、CPL演算
CPL演算の代わりにXOR演算でも良い。

例題a データ1 #0FF0(0000 1111 1111 0000)とデータ2 #F00F(1111 0000 0000 1111)の第7ビットが 0 かどうか調べる。

 必要な演算データは #FF7F(1111 1111 0111 1111)である。

     0000 1111 1111 0000(2)
 OR  1111 1111 0111 1111(2)
     1111 1111 1111 1111(2)    →  #FFFF
 #FFFFと#FF7Fを比較する。→一致しない。
第7ビットは0ではない。
     1111 0000 0000 1111(2)
 OR  1111 1111 0111 1111(2)
     1111 1111 0111 1111(2)    →  #FF7F
 #FF7Fと#FF7Fを比較する。→一致する。
第7ビットは0である。
 #FFFFと#FF7FをXOR演算する。→0ではない。
第7ビットは0ではない。
 #FF7Fと#FF7FをXOR演算する。→0である。
第7ビットは0である。
;第7ビットが0ならばANSに1、1ならばANSに0を格納する。
MAINA    START
         LD      GR0, DATA1  ;LD   GR0, DATA2
         OR      GR0, CHK
         CPL     GR0, CHK    ;XOR  GR0, CHK
         JZE     OK
         LD      GR0, =0
         JUMP    LAST
OK       LD      GR0, =1
LAST     ST      GR0, ANS
         RET
DATA1    DC      #0FF0       ;DATA2    DC      #F00F
CHK      DC      #FF7F
ANS      DS      1
         END

例題b データ1 #0FF0(0000 1111 1111 0000)とデータ2 #F00F(1111 0000 0000 1111)の第7ビットが 1 かどうか調べる。

 必要な演算データは #0080(0000 0000 1000 0000)である。

      0000 1111 1111 0000(2)
 AND  0000 0000 1000 0000(2)
      0000 0000 1000 0000(2)    →  #0080
 #0080と#0080を比較する。→一致する。
第7ビットは1である。
      1111 0000 0000 1111(2)
 AND  0000 0000 1000 0000(2)
      0000 0000 0000 0000(2)    →  #0000
 #0000と#0080を比較する。→一致しない。
第7ビットは1ではない。
 #0080と#0080をXOR演算する。→0である。
第7ビットは1である。
 #0000と#0080をXOR演算する。→0ではない。
第7ビットは1ではない。
;第7ビットが0ならばANSに0、1ならばANSに1を格納する。
MAINB    START
         LD      GR0, DATA1  ;LD   GR0, DATA2
         AND     GR0, CHK
         XOR  GR0, CHK       ;CPL     GR0, CHK
         JZE     OK
         LD      GR0, =0
         JUMP    LAST
OK       LD      GR0, =1
LAST     ST      GR0, ANS
         RET
DATA1    DC      #0FF0       ;DATA2    DC      #F00F
CHK      DC      #0080
ANS      DS      1
         END

 複数のビットの場合でも同じである。

 特定のビットではなく、1または0であるビットの個数を調べる方法については次の「パリティビット」で説明する。


(3) 特定のビットを取り出す

 必要なビットだけを取り出す。取り出したいビットを1、そのほかのビットを0としたデータ(マスクデータという)とAND演算を行う。取り出したいビット以外はすべて0になる。

例題a データ1 #0FF0(0000 1111 1111 0000)の偶数ビットを取り出す。

 マスクデータは #5555(0101 0101 0101 0101)である。

      0000 1111 1111 0000(2)
 AND  0101 0101 0101 0101(2)
      0000 0101 0101 0000(2)    →  #0550


 前へ 目次へ 次へ
 CASL U Copyright © 2003  Hiroshi Masuda

 

 

inserted by FC2 system