비트 연산을 이용한 곱셈,나눗셈 구현.
글쓴이: onezero3 / 작성시간: 수, 2003/09/03 - 3:43오후
옛날에 학교에서 배운 쉬프트 레지스터의 원리가 생각나서,,
곱셈과 나눗셈을 쉬프트 연산과 덧셈만으로 구현해 보았습니다.
여기에서 long 은 32비트임을 전제로 합니다.
/*+-------------------------------------------------------------------------+ | FILE: math.c | | Version: 0.1 | | | | Copyright (c) 2003 Chun Joon Sung | | Email: chunjoonsung@hanmail.net | +-------------------------------------------------------------------------+*/ long multiply(multiplicand, multiplier) long multiplicand; long multiplier; { long i=0, sign=0, sum=0; if( multiplicand & (1<<31) ) { multiplicand = ~multiplicand + 1; sign++; } if( multiplier & (1<<31) ) { multiplier = ~multiplier + 1; sign++; } for(i=0, sum=0; i<32; i++) { if( (multiplier>>i) & 0x01 ) sum += (multiplicand<<i); } if( sign & 0x01 ) { sum = ~sum + 1; } return sum; } long divide(dividend, divisor) long dividend; long divisor; { long i=0, sign=0, div=0, mod\0; sign = 0; if( dividend < 0 ) { dividend = ~dividend + 1; sign++; } if( divisor < 0 ) { divisor = ~divisor + 1; sign++; } if( dividend < divisor ) { div = 0; } else { for(i=0; i<32; i++) { if( dividend < (divisor<<i) ) { if( i > 0 ) i--; break; } else if( dividend == (divisor<<i) ) { break; } } div = 0; for(; i>=0; i--) { if( dividend < divisor ) break; if( dividend >= (divisor<<i) ) { dividend -= (divisor<<i); div += (1<<i); } } } if( sign & 0x01 ) { div = ~div + 1; } return div; } long mod(dividend, divisor) long dividend; long divisor; { return (dividend - mul(divisor,div(dividend,divisor))); }
Forums:
설마 진짜 쓰실 생각은 아니겠죠?
매우 재미있습니다.
근데 혹시나 해서 답글답니다.
Re: 설마 진짜 쓰실 생각은 아니겠죠?
웬만한 곱셈이나 나눗셈 연산은
쉬프트 연산으로 계산하는 것이 빠른경우
컴파일러가 알아서 변환해줍니다.
개발자가 별도로 이런 최적화를 할 필요가 없죠.
이것의 목적은 128비트 256비트로의 확장에 있습니다.
이 함수는 자체로써는 별 다른 의미가 없는 것 같지만,,
128비트 연산이나 256비트 연산에 확장할 수 있으므로
유용하게 사용할 수 있습니다.
댓글 달기