bit演算を理解しよう!

bit演算を理解しよう!

※ 当サイトは広告を含みます。

コンピュータにはbit単位、つまり0と1だけで演算するbit演算が存在します。
それがどんな演算なのか、今回は実用例も交えて学習しましょう。

ちなみにbit単位で演算すると言っても、実際にはbyte単位で処理されます。
その場合は複数のbitを計算することになりますが、常に同じ桁同士をbit演算すると覚えれば大丈夫です。

りさ

よく分からないけど分かりました。

管理人

後に説明するANDとかORの時にこの話を思い出して欲しいな。

論理演算とbitシフト

bit演算は、bit単位で論理を計算する論理演算とbit位置を操作するbitシフトに分類されます。
また、プログラムの世界では数値の1を真、0を偽と扱う概念があり、これを知ってると理解が楽です。

論理演算

NOT演算

bit値を全て反転(0は1に、1は0に)する演算です。処理結果からビット反転と呼ばれることもあります。

NOT演算
管理人

NOT(否定)で反転なのは、論理を否定(真は偽に、偽は真に)するからだと思う。違ったらごめんね。

りさ

どんな時に使うんですか?

管理人

それはもう反転したいなぁ的な時に。

りさ

えぇ...

OR演算

bit値とbit値のORを出力する演算です。ORは片方でも1なら1を出力し、両方とも0な場合のみ0です。
つまりは片方でも真なら真にするってことです。

OR演算
管理人

1番使うのは強制的にbitを立てることかな。

りさ

強制的にbitを立てる?

管理人

こんな感じだよ。

OR演算の活用例

AND演算

bit値とbit値のANDを出力する演算です。ANDは両方とも1の場合に1を出力し、それ以外は0です。
つまりは両方が真で、結果が真になります。

AND演算
管理人

これは強制的にbitを落とすために使うよ。

りさ

bitを落とす?

管理人

こんなの。

AND演算の活用例
管理人

他にもANDを利用して特定のbitだけ取り出す使い方もあるよ。これをbit maskまたは単にマスク処理って言うんだ。

AND演算の活用例 (bit mask)

XOR (Exclusive OR) 演算

覚えづらいと評判のXORです。Exclusiveは日本語で排他的(独占)を意味します。
bit値とbit値のXORを出力する演算で、結論を言うとbit値が異なる場合は1、同じ場合は0です。

XOR演算
管理人

シンプルなのは入力が異なる場合に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演算を日常的に使うけど、それ以外は使わなくても何とかなります。
それでもフラグ管理で綺麗なプログラムが書けるので、学ぶことを推奨します。

◆ コンピュータサイエンスに関する学習コンテンツ

この記事は参考になりましたか?

👆このブログを支援する

関連記事

コメント

この記事へのコメントはありません。