Go의 연산

October 19, 2024

연산의 타입

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을 반환한다.
ABA & B
000
010
100
111
예를 들어 10 & 342를 반환한다. 이는 각 피연산자를 10진수에서 2진수로 변환하면 0000101000100010이 된다. 각 자리수를 비교했을때 둘다 1인 경우에만 1을 반환하므로 결과는 00000010이 된다. 이를 다시 10진수로 변환하면 2가 된다.

| (OR)

|OR 연산자로, 두 비트 중 하나라도 1이면 1을 반환한다. 이전과 같은 예시에서 10 | 3442를 반환한다. 이는 0000101000100010을 비교하여 하나라도 1이면 1을 반환하므로 결과는 00101010이 된다. 이를 다시 10진수로 변환하면 42가 된다.

^ (XOR)

^XOR 연산자로, 두 비트가 서로 다르면 1을 반환한다. 이전과 같은 예시에서 10 ^ 3440을 반환한다. 마찬가지로 0000101000100010을 비교하여 서로 다르면 1을 반환하므로 결과는 00101000이 된다. 이를 다시 10진수로 변환하면 40가 된다. ^^A처럼 단독으로 사용할 수도 있다. 이때는 비트를 반전시킨다.

&^ (AND NOT)

&^는 특정 비트를 0으로 바꾼다. 우변값에 해당하는 비트를 클리어한다. ^를 수행한 후 &를 수행하는 것과 같다. 예를 들어 10 &^ 2^21111110110AND 연산한 결과인 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