Go言語で用意されている数値型の値で利用可能な演算子の中で、
ビット演算に関する演算子に関して解説します。
ビット演算に関する演算子
ビット演算に関する演算子の一覧です。それぞれの演算子について確認してみます。
x | y | x と y のビット単位 論理和 |
x ^ y | x と y のビット単位 排他的論理和 |
x & y | x と y のビット単位 論理積 |
x << n | x の n ビット左シフト |
x >> n | x の n ビット右シフト |
ビットOR
ビット OR は演算子の左辺と右辺の同じ位置にあるビットを比較して、少なくともビットのどちらかが 1 の場合に 1 にします。
x | y
例として 10 と 12 のビット OR を取ってみます。
1010 = 10
1100 = 12
————
1110 = 14
コードで確認しましょう。
import “fmt”
func main() {
x,y := 10,12
fmt.Println(x | y)
}
結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。少なくとも 1 つのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 | 12 は 14 となります。
ビットAND
ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが 1 の場合に 1 にします。
例として 10 と 12 のビット AND を取ってみます。
10 & 12
1010 = 10
1100 = 12
————
1000 = 08
コードで確認しましょう。
import “fmt”
func main() {
x,y := 10,12
fmt.Println(x & y)
}
結果:
結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。両方のビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 & 12 は 8 となります。
ビットXOR
ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか 1 つだけ 1 の場合に 1 にします。
例として 10 と 12 のビット XOR を取ってみます。
10 ^ 12
1010 = 10
1100 = 12
————
0110 = 06
コードで確認しましょう。
import “fmt”
func main() {
x,y := 10,12
fmt.Println(x ^ y)
}
結果:
結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。どちらか片方だけのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 ^ 12 は 6 となります。
左シフト
左シフトは左辺の値を右辺の値だけ左へシフトします。
例として 11 を左へ 2 ビットシフトしてみます。
11 << 2
001011 = 11
————
101100 = 44
コードで確認しましょう。
import “fmt”
func main() {
x,y := 11,2
fmt.Println(x << y)
}
結果:
結論:
各ビットを指定した数だけ左へシフトします。シフトしたことによって空いた右端には 0 が格納されます。結果として 11 << 2 は 44 となります。
左シフトを 1 ビット行うと値は 2 倍になり、 2 ビット行うと 4 倍となります。
右シフト
右シフトは左辺の値を右辺の値だけ右へシフトします。
例として 11 を右へ 1 ビットシフトしてみます。
11 >> 1
1011 = 11
————
0101 = 5
コードで確認しましょう。
import “fmt”
func main() {
x,y := 11,1
fmt.Println(x >> y)
}
結果:
結論:
各ビットを指定した数だけ右へシフトします。シフトしたことによって空いた左端には 0 が格納されます。結果として 11 >> 1 は 5 となります。
右シフトを 1 ビット行うと値は 1/2 倍になり、 2 ビット行うと 1/4 倍となります。