Post

04. 연산자

04. 연산자

✅ 1. 비트 연산자

연산자의미비고
&비트 AND 
|비트 OR 
^비트 XOR단독 사용 시 비트 반전
&^비트 클리어 연산자우변 비트 반전 후 좌변과 AND 연산
«왼쪽 시프트왼쪽 시프트 연산 시 타입의 범위를 벗어나는 경우 비트가 버려진다
»오른쪽 시프트음수면 1, 양수면 0이 왼쪽 비트에 추가된다

✅ 2. 비교 연산자

2.1 Nextafter()

  • 실수값을 정확히 표현할 수 없기 때문에 오차가 생길 수 있다
  • Go에서는 math 패키지에서 Nextafter() 함수를 제공한다
  • x에서 y를 향해 1비트만큼 조정한 값을 반환한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func equal(a, b float64) bool {
	return math.Nextafter(a, b) == b
}

func main() {
	a := 0.1
	b := 0.2
	c := 0.3

	fmt.Printf("%f + %f == %f : %v\n", a, b, c, a+b == c)
	fmt.Printf("%f + %f == %f : %v\n", a, b, c, equal(a+b, c))
}

/*
0.100000 + 0.200000 == 0.300000 : false
0.100000 + 0.200000 == 0.300000 : true
*/

2.2 math/big

  • math/big 패키지에서 제공하는 Float 객체를 사용하면 정확한 수치 계산이 가능하다
1
2
3
4
5
6
	a, _ := new(big.Float).SetString("0.1")
	b, _ := new(big.Float).SetString("0.2")
	c, _ := new(big.Float).SetString("0.3")

	d := new(big.Float).Add(a, b)
	fmt.Println(c.Cmp(d)) // 같으면 0 출력

✅ 3. 대입 연산자

  1. 대입 연산자는 아무런 값을 반환하지 않는다

    1
    2
    
     a = b = 10 // 불가능
     b = a += 2 // 불가능
    
  2. 여러 변수에 한 번에 대입 가능하다

    1
    2
    
     a, b = 3, 4
     a, b = b, a // 값 변경
    
  3. 전위 증감 연산자를 지원하지 않는다

    1
    2
    
     a++ // O
     ++a // X
    

✅ 4. 연산자 우선순위

  • 우선순위가 있다고 해도 소괄호로 묶어서 보기 편하게 만드는 것이 좋다
우선순위연산자 
5* / % « » & &^ 
4+ -^
3== ≠ < ≤ > ≥ 
2&& 
1|| 
This post is licensed under CC BY 4.0 by the author.