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