Backend/Golang

연산자

가은파파 2021. 5. 10. 23:17

학습목표

  • 비트연산자
  • 쉬프트연산자
  • 실수 오버플로우
  • 논리 연산자


비트연산자

& 대응되는 비트가 모두 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
복합대입연산자 : +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
증감연산자 : ++, --

연산자 우선순위 알아야 하지만 괄호로 묶어주자.

비트연산자 활용


MasterRoom uint8 =1 << iota

  • 메모리 절약
  • 변수 만드는 번거로움 줄여줌



'Backend > Golang' 카테고리의 다른 글

fmt 패키지를 이용한 텍스트 입출력  (0) 2021.05.05
변수  (0) 2021.05.03