학습목표
- 비트연산자
- 쉬프트연산자
- 실수 오버플로우
- 논리 연산자
비트연산자
& | 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) |
| |
대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) |
^ | 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) |
&^ | 비트 클리어 연산자. 특정 비트값을 열거할때 사용 ex. 10&^2 1단계 : ^연산을 수행합니다. 2 -> ^2 (1111 1101) 2단계 : & 연산을 수행합니다. 10 &^2 (0000 1000) |
~ | 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산) |
쉬프트연산자
<< | 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) 10 << 2 왼쪽으로 두칸 민다. |
>> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) |
쉬프트를 활용하는 경우 : 비트값을 활용하는 경우
<< 활용한 예제
package main import ( "fmt" ) func main() { var x int8 = 4 var y int8 = 64 //%08b는 8자리까지 채우고 0으로 채워라 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", y, y<<2, y<<2) //x:00000100 x<<2:00010000 x<<2: 16 //y:01000000 y<<2:00000000 y<<2: 0 }
>>활용한 예제
package main import ( "fmt" ) func main() { var x int8 = 16 var y int8 = -128 var z int8 = -1 var w uint8 = 128 //부호가 -이면 1로 채워짐. 양수면 0으로 채워짐 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", w, w>>2, w>>2) //x:00010000 x>>2:00000100 x>>2: 4 //y:10000000 y>>2:11100000 y>>2: -32 //z:11111111 z>>2:11111111 z>>2: -1 //w:10000000 w>>2:00100000 w>>2: 32 }
정수 오버플로우 주의할 것.
실수 오버플로우 해결할 수 있는 방법 예제(오차를 보정할 수 있다)
package main import ( "fmt" "math" ) // 실수 오버플로우 막을 수 있는 방법 func equal(a, b float64) bool { return math.Nextafter(a,b) == b } func main() { var a float64 = 0.1 var b float64 = 0.2 // a라는 공간에 들어갈때(카피할때) 지수와 소수 형태로 들어갈 수 밖에 없다 // 그러므로 정확하게 a는 정확하게 0.3이 아니다. var c float64 = 0.3 fmt.Printf("%0.18f == %0.18f : %v\n", c, a+b, equal(a+b, c)) //0.299999999999999989 == 0.300000000000000044 : true }
논리 연산자
&& : AND조건
|| : OR조건
! : NOT조건
대입연산자 : a=2
복합대입연산자 : +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
증감연산자 : ++, --
연산자 우선순위 알아야 하지만 괄호로 묶어주자.
비트연산자 활용
![](https://blog.kakaocdn.net/dn/ENVNT/btrnBrPr61W/0npSGoHVZGtQJGbNiev8Yk/img.png)
MasterRoom uint8 =1 << iota
- 메모리 절약
- 변수 만드는 번거로움 줄여줌
'Backend > Golang' 카테고리의 다른 글
fmt 패키지를 이용한 텍스트 입출력 (0) | 2021.05.05 |
---|---|
변수 (0) | 2021.05.03 |