연산의 타입
Go에서는 모든 연산자의 각 항은 항상 동일한 타입이어야 한다. 예를 들어, 정수와 정수를 더할 때 두 항은 모두 정수여야 한다. 또한 연산의 결과 역시 피연산자의 타입과 동일하다.
1package main
2
3import "fmt"
4
5func main() {
6 var x int32 = 7
7 var y int32 = 3
8
9 var s float32 = 3.14
10 var t float32 = 5
11
12 fmt.Println("x + y =", x + y) // 10
13 fmt.Println("x - y =", x - y) // 4
14 fmt.Println("x * y =", x * y) // 21
15 fmt.Println("x / y =", x / y) // 2 (7 / 3 = 2.5, 하지만 피연산자의 타입이 int32이므로 정수 부분만 남는다)
16 fmt.Println("x % y =", x % y) // 1
17
18 fmt.Println("s * t =", s * t) // 15.7
19 fmt.Println("s / t =", s / t) // 0.628
20}
21
비트 연산자
비튼 연산자는 비트 단위로 연산한다. 피연산자는 정수여야 하며, 결과 역시 정수이다.
& (AND)
&는 AND 연산자로, 두 비트가 모두 1일 때만 1을 반환한다.
예를 들어 10 & 34는 2를 반환한다.
이는 각 피연산자를 10진수에서 2진수로 변환하면 00001010과 00100010이 된다. 각 자리수를 비교했을때 둘다 1인 경우에만 1을 반환하므로 결과는 00000010이 된다. 이를 다시 10진수로 변환하면 2가 된다.
| (OR)
|는 OR 연산자로, 두 비트 중 하나라도 1이면 1을 반환한다.
이전과 같은 예시에서 10 | 34는 42를 반환한다.
이는 00001010과 00100010을 비교하여 하나라도 1이면 1을 반환하므로 결과는 00101010이 된다. 이를 다시 10진수로 변환하면 42가 된다.
^ (XOR)
^는 XOR 연산자로, 두 비트가 서로 다르면 1을 반환한다.
이전과 같은 예시에서 10 ^ 34는 40을 반환한다.
마찬가지로 00001010과 00100010을 비교하여 서로 다르면 1을 반환하므로 결과는 00101000이 된다. 이를 다시 10진수로 변환하면 40가 된다.
^는 ^A처럼 단독으로 사용할 수도 있다. 이때는 비트를 반전시킨다.
&^ (AND NOT)
&^는 특정 비트를 0으로 바꾼다. 우변값에 해당하는 비트를 클리어한다. ^를 수행한 후 &를 수행하는 것과 같다.
예를 들어 10 &^ 2는 ^2인 11111101에 10을 AND 연산한 결과인 00001000을 반환한다.
<< (left shift)와 >> (right shift)
<<는 왼쪽으로 비트를 이동시키는 연산자이다. >>는 오른쪽으로 비트를 이동시키는 연산자이다.
1package main
2
3import "fmt"
4
5func main() {
6 var x int8 = 4
7 var y int8 = 64
8
9 fmt.Printf(("x%08b x<<2:c x<<2: %d\n" ), x, x<<2) // 00000100 -> 00010000 (16)
10 fmt.Printf(("y%08b y<<2:c y<<2: %d\n" ), y, y<<2) // 01000000 -> 00000000 (0)
11}
12