講義メモ 後半

p.89 論理演算子

・論理関係演算子、否定演算子、ビット論理演算子の総称

p.89 論理関係演算子

・2項&&演算子(別名:AND演算子):bool型とbool型を受け取り、共にtrueならtrueを返し、そうでなければ
 falseを返す。よって「●かつ■ならば」という表現に用いる
例: Console.Write((x == 1) && (y == 1)); //xが1かつyが1ならTrue、でなければFalseを表示
例: string a = ((x == 1) && (y == 1)) ? "共に1" : "共に1とは限らぬ";
・2項||演算子(別名:OR演算子):bool型とbool型を受け取り、共にfalseならfalseを返し、そうでなければtrueを返す。
 よって「●または■ならば」という表現に用いる
例: Console.Write((x == 1) || (y == 1)); //xが1またはyが1ならTrue、でなければFalseを表示
例: string a = ((x == 1) || (y == 1)) ? "1がある" : "1はない";
・よって、論理関係演算子は複数の条件をつなぐために用いることが多い

p.89 否定演算子

・単項!演算子(別名:NOT演算子):bool型を受け取り、true⇔false変換して返す。よって「●でなければ」という表現に用いる
例: Console.Write(!(x == 1)) ; //xが1ならばFalse、でなければTrueを表示
例: string a = !(x == 1) ? "1じゃない" : "1だ";
・よって、単純な条件であれば「!=」を用いる方が見やすい
例: string a = (x != 1) ? "1じゃない" : "1だ";
・主に、複雑な条件の反転やbool型を返すメソッド(後述)の結果反転などに用いる
例: string a = !(x == 1 || y == 1) ? "どちらも1じゃない" : "";
※ちなみにこれは (x != 1 && y != 1)と同じ(ド・モルガンの法則)

p.89 ビット論理演算子

・コンピュータ内ではデータは2進数で扱われ、その1桁をビットという
・例: 32ビットの場合、10進数7 ⇒ 00000000 00000000 00000000 00000111
・C#には本来、データをビット単位で扱う方法が提供されていない
・代わりに、ビット毎に操作できるビット論理演算子を用いる
・2項&演算子:左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをAND演算した結果(1と1なら1、
 でなければ0)の整数を返す
・8ビットの場合、2 & 3 ⇒ 00000010 & 00000011 = 00000010 なので 2
・0とのANDは必ず0になり、1とのANDは元のままになる。これを生かして、特定のビットを欲しい(または0にしたい)場合に
 用いる
・8ビットで2ビット目が欲しい場合、00001110 & 00000010 = 00000010 なので 2
・8ビットで2ビット目を0にしたい場合、00001110 & 11111101 = 00001100 なので 12
・2項|演算子:左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをOR演算した結果(0と0なら0、でなければ1)の整数を返す
・8ビットの場合、2 | 3 ⇒ 00000010 | 00000011 = 00000011 なので 3
・1とのORは必ず1になり、0とのORは元のままになる。これを生かして、特定のビットを欲しい(または1にしたい)場合に用いる
・8ビットで6ビット目を1にしたい場合、00001110 | 00100000 = 00101110 なので 44
・2項^演算子(排他的論理和:XOR):左辺の整数と右辺の整数を2進数にして同じ位置のビットどうしをXOR演算した結果
 (0と0、1と1なら0、でなければ1)の整数を返す
・1とのXORは反転になり、0とのXORは元のままになる。これを生かして、特定のビットを反転したい場合に用いる
・8ビットで1,2ビット目を反転したい場合、00001110 ^ 00000011 = 00001101 なので 13
・C#では上記の3演算子をbool型にも使え、1ビットの値とみなされる。
・よって、2項&&演算子の代わりに2項&演算子、2項||演算子の代わりに2項|演算子を利用できるが、
 短絡評価の機能は持たない
・短絡評価:ANDで接続されている2項は1項めがfalseだと全体がfalse確定なので2項めは評価されない。ORで接続されている
 2項は1項めがtrueだと全体がtrue確定なので2項めは評価されない。このことで効率が上がり、安全性が上がる
 例: string d = (a != 0 && 100 / a > 10) ? "OK" : "NG"; //100÷aは10超?
 ※こうすればaが0の時、短絡評価で「100 / a > 10」の評価をしないので、ゼロ除算による異常終了を回避できる

提出:ミニ演習 mini088.cs

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です