Golang - 비트 연산자
🔥 비트 연산자
저번에 잠깐만 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비트를 강제로 이동시켜주면서 값을 맞춰주는 것 입니다.
- 즉 아주 근사한 값을 줄여줄떄 사용합니다.
Author And Source
이 문제에 관하여(Golang - 비트 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jjimgo/Golang-연산자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)