2021. 5. 16. 23:03ㆍ개발/Golang
1. 산술 연산자

※ 연산자의 각 항의 타입은 항상 같아야 합니다.( 시프트 연산은 예외 ) 그러므로 다를경우 타입 변환을 통해 타입을 맞춰주고 연산을 해야 합니다.
2. 비트 연산자
&, |, ^, &^ 는 비트 단위로 연산하는 비트 연산자입니다. 비트 연산자는 각 비트 단위로 연산을 수행합니다. 그래서 비트 연산자는 계산을 위해 2진수로 표현한 뒤 계산을 해야 합니다.
1) AND 연산자

10의 2진수는 0000 1010 이고 34의 2진수는 0010 0010 입니다. AND 나는 각 2진수 자리수에서 모두 1인 자리만 1로 계산됩니다. 그래서 그결과 0000 0010이되고 10진수로 변환하면 2가 됩니다.
2) | (OR 연산자)

OR 연산은 둘 중 하나라도 1이면 1이됩니다. 연산 결과는 10진수로 42가 됩니다.
3) ^ ( XOR 연산자 )

XOR 연산은 두 숫자가 다를 경우 1이 됩니다. 연산 결과는 10진수로 40이 됩니다.
^는 ^A처럼 단독으로 사용할 수 도 있습니다. ^를 단독으로 사용하면 비트 반전을 합니다. ( 1은 0으로 , 0은 1로 )
package main
import "fmt"
func main() {
var x1 int8 = 34 // 8비트 정수, 00100010
var x2 int16 = 34 // 16비트 정수, 00000000 00100010
var x3 uint8 = 34 // 8비트 부호가 없는 정수, 00100010
var x4 uint16 = 34 // 16비트 부호가 없는 정수, 00000000 00100010
fmt.Printf("^%d = %5d,\t %08b\n", x1,^x1,uint8(^x1))
fmt.Printf("^%d = %5d,\t %016b\n",x2,^x2,uint16(^x2))
fmt.Printf("^%d = %5d,\t %08b\n",x3,^x3,^x3)
fmt.Printf("^%d = %5d,\t %16b\n",x4,^x4,^x4)
}

4) &^ ( 비트 클리어 연산자 )

먼저 ^연산을 수행후 , & 수행을 합니다 ^연산은 비트를 반전한후 AND 연산으로 비트 클리어 연산을 진행합니다.
비트클리어 연산자는 특정비트만 0으로 바꾸고 싶을때 사용합니다.
3. 시프트 연산자
비트를 왼쪽 또는 오른쪽으로 밀거나 당기는 연산자입니다. << 왼쪽시프트와 >> 오른쪽 시피트를 지원합니다.
1) << ( 왼쪽 시프트 )

- 오른쪽 피연산자값 만큼 전체 비트를 왼쪽으로 밀어냅니다. 이때 이동되어 빈 자리는 0이 채워지고 자리수를 벗어난 비트는 버려집니다.
- 오른쪽 피연산자는 반드시 양의 정수여야하고 음의 정수일경우 비정상적으로 종료가 됩니다.
package main
import "fmt"
func main() {
var x int8 = 4
var y int8 = 64
fmt.Printf("x:%08b x<<2: %08b x<<2: %d\n", x,x <<2, x<<2) // 왼쪽 시프트
fmt.Printf("y:%08b x<<2: %08b y<<2: %d\n", y,y <<2, y<<2) // 왼쪽 시프트
}

- x의 %08b는 8자리값 2진수를 출력해야하므로 4의 2진수 0000 0100이고 왼쪽 시프트를 할경우 0001 0000 이므로 값은 16이 됩니다.
- y는 %08b는 8자리값 2진수를 출력해야하므로 64의 2진수는 0100 0000이고 왼쪽 시프트를 할경우 0001 0000 0000이 되어야 하는데 int8은 8비트 정수이므로 0001이 버러져 0000 0000이되어 값이 0이 됩니다.
2) << (오른쪽 시프트)

- 비트값을 오른쪽으로 밉니다.
- 비트수를 나타내는 오른쪽 피연산자는 반드시 양의 정수여야 합니다.
- 왼쪽 추가되는 비트는 부호의 값으로, 오른쪽으로 비트 이동시 부호가없는 정수이면 0, 음수이면 1이 채워집니다.
package main
import "fmt"
func main() {
var x int8 = 16
var y int8 = -128
var z int8 = -1
var w uint8 = 128
fmt.Printf("x:%08b x>>2: %08b x>>2: %d\n", x, x>>2, x>>2)
fmt.Printf("y:%08b y>>2: %08b y>>2: %d\n", uint8(y), uint8(y>>2), y>>2)
fmt.Printf("z:%08b z>>2: %08b z>>2: %d\n", uint8(z), uint8(z>>2), z>>2)
fmt.Printf("w:%08b w>>2: %08b w>>2: %d\n", uint8(w), uint8(w>>2), w>>2)
}

- x의 정수는 16이고 2진수로는 0001 0000입니다. 이값을 오른쪽으로 2칸 이동하면 0000 0100이되므로 10진수 4가 됩니다.
- y는 int8타입 -128의 2진수 표현은 1000 0000입니다. 최상위의 비트 값이 1이므로 오른쪽으로 비트 이동시 1이 채워집니다. 오른쪽 2칸 밀어내면 1110 0000이되고 10진수로 -32가 됩니다.
- z는 모든 비트 값이 1인 정수이며, 최상위 비트 값이 1이므로 오른쪽 비트 이동시 1111 1111이 변함이 없기에 -1이 나옵니다.
- w는 부호없는 1바이트 정수타입이고 128은 2진수로 1000 0000이고 w >> 2으로 오른쪽으로 2칸 시프트하면 맨 왼쪽에 0이 채워져서 0010 0000이 됩니다.
나머지 연산자는 다음페이지에 올리도록 하겠습니다.
'개발 > Golang' 카테고리의 다른 글
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 8강 상수 (0) | 2021.05.23 |
|---|---|
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 7강 함수 (0) | 2021.05.22 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 6강 연산자 (2) (0) | 2021.05.21 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 5강 fmt 패키지를 이용한 텍스트 입출력 (0) | 2021.05.16 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 4강 변수 (0) | 2021.05.08 |