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かどうかを調べる。
※ CPL演算の代わりにXOR演算でも良い。
調べるデータ 演算データ 演算 0 特定ビットが0、そのほかは1 OR演算、CPL演算 1 特定ビットが1、そのほかは0 AND演算、CPL演算
例題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 |