How We Coding

- 출처 : 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;
    forint 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 이 출력된다.