일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 통계적 유의성
- AWS
- 퀀트 트레이딩
- eclipse
- mark minervini
- 제시 리버모어
- 파이어족
- 추세추종 2%룰
- 연금저축계좌
- 2%룰
- 이클립스
- 파이어족 포트폴리오
- 에드워드 소프
- 파이어족 자산증식
- tensorflow
- python
- 신의 시간술
- 니콜라스 다바스
- 마크미너비니
- 파이어족 저축
- 아웃풋 트레이닝
- H는 통계를 모른다.
- 마크 미너비니
- GIT
- 파이어족 자산
- 데이비드 라이언
- 자산배분
- 퀀터스 하지 마세요
- 김프
- 데이빗 라이언
- Today
- Total
머신러닝과 기술적 분석
음수의 Bit Shift 연산시 주의사항 본문
임베디드 환경에서는 연산속도가 중요하기 때문에 으로 나누는 연산의 경우 나눗셈보다는 right bit-shift 연산을 사용하게 된다.
하지만 음수의 경우에는 right bit-shift 연산을 사용할 때 주의할 점이 있다.
1. 140 >> 10
의 결과는 ?
140을 right shift 10 했으므로 140 / 1024 를 연산한 0이 된다.
2. -140 >> 10
의 결과는 ?
-140을 right shift 10 했으므로 -140 / 1024 를 연산한 0이 될줄 알고 코딩했던 적이 있다.
gcc compiler 와 visual c++ compiler 모두가 0이 되지 않는다.
#include <stdio.h>
int main()
{
printf("140 >> 10 = %d\n", 140>>10);
printf("-140 >> 10 = %d\n", -140>>10);
}
위와 같은 코드를 실행해보면
140 >> 10 = 0
-140 >> 10 = -1
이 된다.
3. 왜 -140 >> 10
의 결과가 -1 일까?
컴퓨터 입장에서 생각해보자. -140 >> 10
이라는 code 는 말그대로 -140 을 10칸 right shift 한 것이다.
3.1 -140이 메모리에 저장되는 방식? (16비트라고 가정)
140 == 이므로 0000_0000_1001_0000(2) 로 저장된다.
-140은 140의 2’s complement 이므로
-140 == 1111_1111_0110_1111(2) + 0000_0000_0000_0001(2) == 1111_1111_0111_0000(2) 이 된다.
3.2 -140 == 1111_1111_0111_0000(2) 를 right shift 10 하면?
xxxx_xxxx_xx11_1111(2) 가 된다. 여기서 “x” 표시는 예측할 수 없다는 뜻이다.
앞서 살펴본 gcc compiler 와 visual c++ compiler 의 경우는 “x” 가 모두 1로 채워져서
-140 >> 10 == -1
이 되었던 것이다.
정리
음수의 나눗셈을 right bit shift 로 대체하는 경우에는 주의해서 사용해야 한다.
M >> N
의 연산에서 M <0 && M < 2^N
이 성립할 경우 결과를 “0” 으로 예상하기 쉽지만 gcc compiler 와 visual c++ compiler 의 경우 “-1” 이 된다.
이러한 경우에는 compiler 마다 결과값에 차이가 있다고 한다.