Golang 연산

soso·2023년 9월 26일
0

묘공노트

목록 보기
2/13

• 이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 6장 써머리입니다.


6-1. 산술 연산자

  • 숫자 연산을 하는 연산자
    • 사칙 연산, 나머지 : + - * / %
    • 비트 연산 : & |(OR) ^(XOR) &^(비트클리어)
    • 시프트 연산 : << (정수 << 양의 정수), >> (정수 >> 양의 정수)
  • 각 항의 타입은 항상 같아야 한다. (시프트 연산은 예외)
    타입을 맞춘 후 연산

📌비트연산자

  • 비트 단위로 연산. 정수만 피연산자 가능. 컴퓨터의 0,1이 1비트
    • & (AND) : 2진수 계산. A, B 모두 1일 때 A&B = 1
      하나라도 0이면 0
    • | (OR) : 하나라도 1이면 1.
    • ^ (XOR) : A와 B가 다르면 1
    • &^ (비트클리어) : 특정 비트를 0으로 바꾸는 연산자.

📌 시프트 연산자

  • 오른쪽 혹은 왼쪽으로 비트를 밀거나 당기는 연산자
    • << (왼쪽시프트)
      오른쪽 피연산자만큼 왼쪽으로 비트를 밀어냄
      비트가 이동되어 빈자리는 0으로 채워지고, 자릿수를 벗어난 비트는 버려짐
    • >> (오른쪽시프트)
      비트값을 오른쪽으로 밀어냄. 왼쪽에 추가되는 비트는 최상위 비트값과 같은 비트값이 추가됨. 음수라면 1, 양수라면 0으로 채워짐.

6-2. 비교연산자

  • 양변을 비교하여 참이라면 불리언 true, 거짓이라면 false 반환
  • ==, !=,<,>,<=,>=
  • if, switch, for문에서 주로 사용

    👉 주의할 점

    • 정수 오버플로
      정수가 정수 타입의 범위를 벗어난 경우 값이 비정상으로 변화하는 현상

    • 정수 언더플로
      오버플로와 반대로 정수 타입이 표현할 수 있는 가장 작은 값에서 -1 했을 때는 가장 큰 값으로 바뀜
      var a int8 = -128
      a -1 = 127 // -129가 아니다. : 언더플로

6-3. 실수 오차

  • 엄청 작은 오차를 무시하는 방법
  • 1비트 차이만큼 비교
    • Nextafter() 함수 사용

      import "math"
      
      func Nextafter(x, y float64) (r float64) 
      
      func equal(a, b float64) bool {
       		return math.Nextafter(a, b) == b
       }
      
      func main(){
      	var a float64 = 0.1
      	var b float64 = 0.2
      var c float64 = 0.3
       
       fmt.Print("%0.18f == %0.18f : %v\n",c,a+b,equal(a+b,c))
         }
       // 콘솔
       // 0.29999999999999989 == 0.300000000000044 : true 
       // 엄청 작은 오차가 있지만, 1비트 단위로 무시하였기 때문에 true로 >출력

6-4. 논리 연산자

  • boolean (불리언) 피연산자를 대상으로 하여 true / false 반환
    • && (AND) : 양변 모두 ture => true 반환
    • || (OR) : 하나라도 true => true 반환
    • ! (NOT) : 단항 연산자. true이면 false, false이면 true 반환

6-5. 대입 연산자

  • = 대입 연산자는 우변 값을 좌변 (메모리공간) 에 복사. 좌변은 변수가 와야 함
    • 대입 연산자
     var a int 
     a = 10    
    • 복수 대입 연산자
    var a, b int = 3, 4
    • 복합대입연산자
     var a = 10
     a = a+2 
     a += 2 
    • 증감 연산자
     var a int = 10
    
    // a 값을 모두 1씩 증가
     a = a+1
     a += 1
     a ++
    
    // a 값을 모두 1씩 감소
     a = a-1
     a -= 1
     a --
   
   

0개의 댓글