Golang - 비트 연산자

Lumi·2022년 2월 6일
0

Golang

목록 보기
3/38
post-thumbnail

🔥 비트 연산자

저번에 잠깐만 Golang에 대해서 찍먹을 했을떄 이 부분이 가장 어려웠었습니다.

다시 공부를 해보면서 이해를 하였고 해당 내용을 정리하였습니다.

10&^2라는 연산을 하게 되었을떄를 예시로 들겠습니다.

1단계 : ^ 연산을 먼저 수행한다.

0000 0010   => 2

1111 1101   => ^2

- 이처럼 비트 반전이 일어납니다.

그후 10과 ^2의 값을 &통해서 비교를 하게 됩니다.

0000 1010  =>  10

			    &

1111 1101  =>  ^2


하게 되면 최종적으로

0000 1000   => 10&^2 

라는 값이 나오게 됩니다.

이외에도 &,| 를 통해서 활용 가능합니다.

  • 위에 있는 예시를 보면 어떤식으로 작동을 하는지 확인할수 있습니다.

🔥 시프트 연산자

비트를 밀어내는 행위를 말합니다.

10 << 2 라는 예시를 들어보겠습니다.

10의 2진수 값은

0000 1010입니다.

여기에서 << 2를 적용하면

0010 1000 이 됩니다.
- 왼쪽으로 2칸씩 밀어내는 것

그러기 떄문에 10 << 2의 최종 결과는

40이 됩니다.

사실 이러한 계산법은 현실에서는 사용하기 굉장히 어려울꺼 같습니다.

  • 왜냐하면 비트값을 계산해야 하기 떄문에;;

항상 그런것은 아니지만 보통 2칸을 밀게되면 4배의 효과가 있습니다.

  • 3칸을 밀면 8배의 효과입니다.
  • 즉 2^n배의 효과가 발휘 됩니다.

🔥 실수 비교

간단한 코드를 통해 실수비교의 문제점이 무엇인지 알아보겠습니다.

일단 0.1 + 0.2 = 0.3이 된다는 것은 인식적으로 누구나 알수 있을것 입니다.

하지만 컴퓨터가 보았을떄는 이런식으로 작동을 하지 않습니다.

실수를 표현할떄에 메모리 칸은 총3개가 있습니다.

1. +,-인지 판별
2. 정수부분
3. 실수 부분

이런식으로 구성이 되는데 컴퓨터에서는 실수부분을 정확하게 구현을 하지 못하기 떄문에 이런 오류가 발생을 합니다.

- 즉 0.1이라는 값은 컴퓨터에게 실제로
0.100000000000000000001 로 구현이 되기 때문에 false라는 값이 나오게 됩니다.

이러한 문제를 완벽하게 극복을 하는 방법은 없습니다.

  • Nextafter()를 사용

이처럼 Nextafter를 활용하면 시각적으로 값을 비교할수 있습니다.

Nextafter작동원리

이 부분또한 비트를 움직이는 함수 입니다.
- 1비트 만큼 움직입니다.

앞서 말한 실수값의 차이는 1비트만큼의 차이가 있기 떄문에

이러한 1비트를 강제로 이동시켜주면서 값을 맞춰주는 것 입니다.
- 즉 아주 근사한 값을 줄여줄떄 사용합니다.
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글