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