Micomprocedure Wiki
ビット演算
をテンプレートにして作成
開始行:
C言語によるビット演算について
C言語のビット演算子は次のものがある。
|演算子||h
|&|AND(論理積)|
|||OR(論理和)|
|^|EX-OR(排他的論理和)|
|~|NOT(否定)|
|>>|右シフト|
|<<|左シフト|
・&(AND),|(OR),^(EX-OR)
2項演算子。2入力のビット毎に演算する。
真理値表は以下の通り
|A|B|A&B|A|B|A^B|h
|0|0|0|0|0|
|0|1|0|1|1|
|1|0|0|1|1|
|1|1|1|1|0|
使用例)
01010101 & 11001100 => 01000100
01010101 | 11001100 => 11011101
01010101 ^ 11001100 => 10011001
・~(NOT)
1項演算子。入力のビットをすべて反転する。
真理値表は以下の通り
|A|~A|h
|0|1|
|1|0|
使用例)
~ 01010101 => 10101010
・<<,>>
2項演算子。左側の入力を右側の入力ビット分シフトする。
左シフトでは、左側で桁をオーバーした分は捨てられ、右側からは0が入れられる。
使用例)
01010101 << 3 => 10101000
右シフトでは、右側でオーバーした分は捨てられ、左側は処理系依存。
論理シフトする処理系では0が、算術シフトする処理系では符号が入る。
符号なし整数型を使えば必ず0が入る。
使用例)
01010101 >> 3 => 00001010
~
・使用例
ビット演算はフラグ処理などに用いることができる。
ANDは指定ビットを0にでき、ORは指定ビットを1にでき、EX-ORは指定ビットの反転ができる。
例えば変数Flagsの2ビット目を1にする(フラグを立てる)には次のようにすればよい。
#code(cpp){{
Flags |= 0x04//00000100;
}}
逆に2ビット目を0にする(フラグを折る)には次のようにする。
#code(cpp){{
Flags &= 0xFC//11111011;
}}
より一般にnビット目に対して次のようにしてフラグを立てたり折ったりできる。
#code(cpp){{
Flags |= 1 << n;
Flags &= ~(1 << n);
}}
フラグが立っているかどうかの確認は次のように行う。
#code(cpp){{
if(Flags & 1 << n)
}}
列挙型とマクロを用いて次のようにまとめることもできる。
#code(cpp){{
unsigned char Flags=0;
enum FlagName = {GameStart,ItemGet,TalkEnd,Present}
#define FLAG_ON(FNAME) (Flags|=1<<FNAME)
#define FLAG_OFF(FNAME) (Flags&=~(1<<FNAME))
#define FLAG_CHECK(FNAME) (Flags&1<<FNAME)
}}
次のように使える
#code(cpp){{
FLAG_ON(ItemGet);
...
if(!FLAG_CHECK(ItemGet)){
printf("I don't have the item.");
}
}}
マクロではなく関数を使ってもいいし、クラスにまとめても良い。
8個より多いフラグを使いたい場合は次のように配列を用いることもできる。
#code(cpp){{
unsigned char Flags[32]={0};
enum FlagName = {GameStart,ItemGet,TalkEnd,Present}
#define FLAG_ON(FNAME) (Flags[FNAME/8]&=1<<FNAME%8)
#define FLAG_OFF(FNAME) (Flags[FNAME/8]&=~(1<<FNAME%8))
#define FLAG_CHECK(FNAME) (Flags[FNAME/8]&1<<FNAME%8)
}}
ただし最近ではこのようなフラグ管理を行う機会は少ないと思われる。
よほどフラグの数が多くならない限り、bool型の変数を利用すればよい。
終了行:
C言語によるビット演算について
C言語のビット演算子は次のものがある。
|演算子||h
|&|AND(論理積)|
|||OR(論理和)|
|^|EX-OR(排他的論理和)|
|~|NOT(否定)|
|>>|右シフト|
|<<|左シフト|
・&(AND),|(OR),^(EX-OR)
2項演算子。2入力のビット毎に演算する。
真理値表は以下の通り
|A|B|A&B|A|B|A^B|h
|0|0|0|0|0|
|0|1|0|1|1|
|1|0|0|1|1|
|1|1|1|1|0|
使用例)
01010101 & 11001100 => 01000100
01010101 | 11001100 => 11011101
01010101 ^ 11001100 => 10011001
・~(NOT)
1項演算子。入力のビットをすべて反転する。
真理値表は以下の通り
|A|~A|h
|0|1|
|1|0|
使用例)
~ 01010101 => 10101010
・<<,>>
2項演算子。左側の入力を右側の入力ビット分シフトする。
左シフトでは、左側で桁をオーバーした分は捨てられ、右側からは0が入れられる。
使用例)
01010101 << 3 => 10101000
右シフトでは、右側でオーバーした分は捨てられ、左側は処理系依存。
論理シフトする処理系では0が、算術シフトする処理系では符号が入る。
符号なし整数型を使えば必ず0が入る。
使用例)
01010101 >> 3 => 00001010
~
・使用例
ビット演算はフラグ処理などに用いることができる。
ANDは指定ビットを0にでき、ORは指定ビットを1にでき、EX-ORは指定ビットの反転ができる。
例えば変数Flagsの2ビット目を1にする(フラグを立てる)には次のようにすればよい。
#code(cpp){{
Flags |= 0x04//00000100;
}}
逆に2ビット目を0にする(フラグを折る)には次のようにする。
#code(cpp){{
Flags &= 0xFC//11111011;
}}
より一般にnビット目に対して次のようにしてフラグを立てたり折ったりできる。
#code(cpp){{
Flags |= 1 << n;
Flags &= ~(1 << n);
}}
フラグが立っているかどうかの確認は次のように行う。
#code(cpp){{
if(Flags & 1 << n)
}}
列挙型とマクロを用いて次のようにまとめることもできる。
#code(cpp){{
unsigned char Flags=0;
enum FlagName = {GameStart,ItemGet,TalkEnd,Present}
#define FLAG_ON(FNAME) (Flags|=1<<FNAME)
#define FLAG_OFF(FNAME) (Flags&=~(1<<FNAME))
#define FLAG_CHECK(FNAME) (Flags&1<<FNAME)
}}
次のように使える
#code(cpp){{
FLAG_ON(ItemGet);
...
if(!FLAG_CHECK(ItemGet)){
printf("I don't have the item.");
}
}}
マクロではなく関数を使ってもいいし、クラスにまとめても良い。
8個より多いフラグを使いたい場合は次のように配列を用いることもできる。
#code(cpp){{
unsigned char Flags[32]={0};
enum FlagName = {GameStart,ItemGet,TalkEnd,Present}
#define FLAG_ON(FNAME) (Flags[FNAME/8]&=1<<FNAME%8)
#define FLAG_OFF(FNAME) (Flags[FNAME/8]&=~(1<<FNAME%8))
#define FLAG_CHECK(FNAME) (Flags[FNAME/8]&1<<FNAME%8)
}}
ただし最近ではこのようなフラグ管理を行う機会は少ないと思われる。
よほどフラグの数が多くならない限り、bool型の変数を利用すればよい。
ページ名:
サイト内を検索
AND検索
OR検索
操作メニュー
サークル情報
†
名称
東北大学文化部登録団体
東北大学マイコンプロシージャ
部室
川内北キャンパス内
川内サークル部室棟 4階
416号室
設立
1979年4月1日
(45年前)
活動内容
ゲームの制作・発表等
(
詳細
)
連絡先
こちら
↑
Twitter
†
@micom_procedure からのツイート
このウェブページについて
ここを編集
コンテンツ
†
トップページ
マイコンプロシージャとは?
公開中の作品
その他の作品
資料室
情報室
リンク
部内向けページトップ
最新の20件
2023年05月25日
ContactUs
2022年11月03日
公開中の作品/2021年度新入生プロジェクト/Gravity-Lost
公開中の作品/2021年度新入生プロジェクト/はるさがし
2021年12月13日
公開中の作品/2021年度新入生プロジェクト/落単・タイム・アタック!
公開中の作品/2021年度新入生プロジェクト/神社からの脱出
RecentDeleted
公開中の作品/2021年度新入生プロジェクト/THE Unexpected Fighting Operation
公開中の作品/2021年度新入生プロジェクト
2021年12月03日
公開中の作品/2020年度新入生プロジェクト/城熊
公開中の作品/2020年度新入生プロジェクト
2021年07月18日
公開中の作品
ProcGameJam9
Inneer/C++_const
2021年04月18日
公開中の作品/2020年度新入生プロジェクト/CrossFade
2021年04月17日
2021年度新歓情報
公開中の作品/2020年度新入生プロジェクト/TeamC no game
2021年04月07日
ようこそ
公開中の作品/2020年度新入生プロジェクト/トキノカダイ
2021年04月04日
2020年度新歓情報
2020年09月15日
ProcGameJam10
ここを編集