비트 연산을 이용한 정수의 산술연산 (분석은 아직..)
Language/C2018. 6. 4. 00:09
- 출처 : http://blog.naver.com/PostView.nhn?blogId=kimsung9k&logNo=110121881497
<비트 연산을 이용한 정수의 산술연산 >
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <cstdio> #include <vector> using namespace std; long long plus( long long a, long long b ) { long long xor1 = a^b; long long and1 = a&b; and1 = and1 << 1; while( ( and1&xor1 ) != 0 ) { long long txor = and1^xor1; long long tand = and1&xor1; long long uand = tand << 1; and1 = uand; xor1 = txor; } return xor1^and1; } long long minus( long long a, long long b ) { long long first = a^b; long long second = a^(a|b); first = first^second; return plus( first, plus( (~second), 1 ) ); } long long mult( long long a, long long b ) { bool a_is_minus = false; bool b_is_minus = false; bool is_odd = false; if( a < 0 ){ a_is_minus = true; a = ~minus( a,1 ); } if( b < 0 ){ b_is_minus = true; b = ~minus( b,1 ); } if( (b&1) == 1 ) is_odd = true; long long mult_a = 0LL; for( int i=1; i < 32; i=plus( i,1 ) ){ b = b >> 1; if( (b & 1) == 1 ) mult_a = plus( mult_a, (a << i) ); } if( is_odd ) mult_a = plus( mult_a, a ); if( a_is_minus^b_is_minus ) mult_a = plus( ~mult_a, 1 ); return mult_a; } int main() { int a, b; scanf("%d%d", &a, &b); printf("%lld\n", mult(a, b)); return 0; } | cs |
>> 매개변수와 리턴타입을 모두 long long 으로 변경하고, 46라인을 i < 32 로 변경하니, long long 까지 처리가 가능하였다.
>> a = 100000000, b = 100000000 을 입력으로 주면 10000000000000000 이 출력된다.
'Language > C' 카테고리의 다른 글
scanf() 에서 공백을 포함한 문자열 입력받기 (0) | 2018.04.05 |
---|---|
printf() 서식문자 %g (0) | 2018.03.07 |
배열에서 배열의 크기 이상의 인덱스를 사용하게 되면... (0) | 2018.02.27 |