Goのビット演算について

Goビット演算子について Go

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 を取ってみます。

10 | 12
1010 = 10
1100 = 12
————
1110 = 14

コードで確認しましょう。

package main
import “fmt”

func main() {
    x,y := 10,12

    fmt.Println(x | y)
}
結果:
14

結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。少なくとも 1 つのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 | 12 は 14 となります。

ビットAND

ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが 1 の場合に 1 にします。

x & y
例として 10 と 12 のビット AND を取ってみます。
10 & 12

1010 = 10
1100 = 12
————
1000 = 08

コードで確認しましょう。

package main
import “fmt”

func main() {
    x,y := 10,12

    fmt.Println(x & y)
}

結果:

8

結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。両方のビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 & 12 は 8 となります。

ビットXOR

ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、どちらか 1 つだけ 1 の場合に 1 にします。

x ^ y
例として 10 と 12 のビット XOR を取ってみます。
10 ^ 12

1010 = 10
1100 = 12
————
0110 = 06

コードで確認しましょう。

package main
import “fmt”

func main() {
    x,y := 10,12

    fmt.Println(x ^ y)
}

結果:

6

結論:
10 と 12 を 2 進数で表示し、ビット単位で比較します。どちらか片方だけのビットが 1 になっている場合は 1 、 それ以外は 0 となります。結果として 10 ^ 12 は 6 となります。

左シフト

左シフトは左辺の値を右辺の値だけ左へシフトします。

x << n
例として 11 を左へ 2 ビットシフトしてみます。
11 << 2

001011 = 11
————
101100 = 44

コードで確認しましょう。

package main
import “fmt”
func main() {
    x,y := 11,2

    fmt.Println(x << y)
}

結果:

44

結論:
各ビットを指定した数だけ左へシフトします。シフトしたことによって空いた右端には 0 が格納されます。結果として 11 << 2 は 44 となります。

左シフトを 1 ビット行うと値は 2 倍になり、 2 ビット行うと 4 倍となります。

右シフト

右シフトは左辺の値を右辺の値だけ右へシフトします。

x >> n
例として 11 を右へ 1 ビットシフトしてみます。
11 >> 1

1011 = 11
————
0101 = 5

コードで確認しましょう。

package main
import “fmt”

func main() {
    x,y := 11,1

    fmt.Println(x >> y)
}

結果:

5

結論:
各ビットを指定した数だけ右へシフトします。シフトしたことによって空いた左端には 0 が格納されます。結果として 11 >> 1 は 5 となります。

右シフトを 1 ビット行うと値は 1/2 倍になり、 2 ビット行うと 1/4 倍となります。

コメント

タイトルとURLをコピーしました