コンピュータにはbit単位、つまり0と1だけで演算するbit演算が存在します。
それがどんな演算なのか、今回は実用例も交えて学習しましょう。
ちなみにbit単位で演算すると言っても、実際にはbyte単位で処理されます。
その場合は複数のbitを計算することになりますが、常に同じ桁同士をbit演算すると覚えれば大丈夫です。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
よく分からないけど分かりました。
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
後に説明するANDとかORの時にこの話を思い出して欲しいな。
論理演算とbitシフト
bit演算は、bit単位で論理を計算する論理演算とbit位置を操作するbitシフトに分類されます。
また、プログラムの世界では数値の1を真、0を偽と扱う概念があり、これを知ってると理解が楽です。
論理演算
NOT演算
bit値を全て反転(0は1に、1は0に)する演算です。処理結果からビット反転と呼ばれることもあります。
![NOT演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0001.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
NOT(否定)で反転なのは、論理を否定(真は偽に、偽は真に)するからだと思う。違ったらごめんね。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
どんな時に使うんですか?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
それはもう反転したいなぁ的な時に。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
えぇ...
OR演算
bit値とbit値のORを出力する演算です。ORは片方でも1なら1を出力し、両方とも0な場合のみ0です。
つまりは片方でも真なら真にするってことです。
![OR演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0002.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
1番使うのは強制的にbitを立てることかな。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
強制的にbitを立てる?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
こんな感じだよ。
![OR演算の活用例](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0003.webp)
AND演算
bit値とbit値のANDを出力する演算です。ANDは両方とも1の場合に1を出力し、それ以外は0です。
つまりは両方が真で、結果が真になります。
![AND演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0004.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
これは強制的にbitを落とすために使うよ。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
bitを落とす?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
こんなの。
![AND演算の活用例](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0005.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
他にもANDを利用して特定のbitだけ取り出す使い方もあるよ。これをbit maskまたは単にマスク処理って言うんだ。
![AND演算の活用例 (bit mask)](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0006.webp)
XOR (Exclusive OR) 演算
覚えづらいと評判のXORです。Exclusiveは日本語で排他的(独占)を意味します。
bit値とbit値のXORを出力する演算で、結論を言うとbit値が異なる場合は1、同じ場合は0です。
![XOR演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0007.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
シンプルなのは入力が異なる場合に1。後はExclusiveが独占を意味するから、片方のみ有効なORとして考えるとか。
通常のORだと両方1は1だけど、片方だけで独占できないから0にするって考え方だよ。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
どんな時に使うんですか?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
XOR交換アルゴリズムってのがあるらしいよ。へぇって思った。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
えっ?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
ここ100年くらいXOR使ってないんだ。
bitシフト
bitシフトとはbit値を左または右にn個ずらす操作です。まずは左右に2bitずらず具体例を用意したので見てみましょう。
![左シフト演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0008.webp)
![右シフト演算](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0009.webp)
このbitシフトですが、大きく論理シフトと算術シフトに分類されます。違いは最上位に存在する符号bitとシフト後の空いた空間の扱いです。
論理シフト
論理シフトは簡単です。符号bitを無視して全bitをn個シフト、その時に空いた場所は0にします。
![論理シフト演算 (左)](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0010.webp)
![論理シフト演算 (右)](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0011.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
これは2つのbit値を揃えたい時とか、最上位bitを最下位まで移動したい時とかに使うよ。
一般的にANDやORする前後で、bit位置を揃えるために使うのが基本かな。
算術シフト
算術シフトは符号bitを考慮するため、左シフトと右シフトで挙動が変わります。
左シフトは符号bitを維持したままシフトして、空いた右の空間は0にします。
対して右シフトも符号bitを維持したままシフトしますが、空いた左の空間には符号bitと同じ値をいれます。
![算術シフト演算 (左)](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0012.webp)
![算術シフト演算 (右)](https://takemi.blog/wp-content/uploads/2023/09/222FA2C4B3504D749B48503E16F97BBC_0013.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
この算術シフトだけど、めちゃくちゃ注意点があって、挙動が処理系(CPUとかOSとかプログラム言語など)に依存するんだ。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
対策はあるんですか?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
使わなければいいよ。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
えっ!?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
論理シフトを使うことはあっても算術シフトは使ったことがない。寧ろどんな時に利用するのか教えて欲しいくらい。
あとがき
ハードウェアに近いエンジニアだとbit演算を日常的に使うけど、それ以外は使わなくても何とかなります。
それでもフラグ管理で綺麗なプログラムが書けるので、学ぶことを推奨します。
◆ コンピュータサイエンスに関する学習コンテンツ
この記事は参考になりましたか?
コメント