位操作实现加减乘除

  1 // Bit Operation Implements Add, Submit, Multiply, Divide
  2 // Use only Integer with little length
  3 
  4 #include <iostream>
  5 using namespace std;
  6 
  7 // add
  8 int add( int a, int b ){ 
  9   int c;
 10   while( c = (a&b) ){
 11     a = (a^b);
 12     b = (c<<1);
 13   }
 14   return (a^b);
 15 }
 16 
 17 // complementary code
 18 int rev( int a ){
 19   return add((~a), 1);
 20 }
 21 
 22 // is positive
 23 int ispos( int a ){
 24   return (a&0xFFFF) && !(a&0x8000);
 25 }
 26 
 27 // is negative
 28 int isneg( int a ){
 29   return a&0x8000;
 30 }
 31 
 32 // is 0
 33 int iszero( int a ){
 34   return !(a&0xFFFF);
 35 }
 36 
 37 // if or not have a > b >= 0
 38 int isbig_pos( int a, int b ){
 39   int c = 1;
 40     b = (a^b);
 41   if( iszero(b) ) return 0;
 42   while( b >>= 1 ){
 43     c <<= 1;
 44   }
 45   return (c&a);
 46 }
 47 
 48 // if or not have a > b
 49 int isbig( int a, int b ){
 50   if( isneg(a) ){
 51     if( isneg(b) ){
 52       return isbig_pos( rev(b), rev(a) );
 53     }
 54     return 0;
 55   }
 56   if( isneg(b) ) return 1;
 57   return isbig_pos(a, b);
 58 }
 59 
 60 // submit
 61 int sub( int a, int b ){ 
 62   return add(a, rev(b));
 63 }
 64 
 65 // two positive numbers multiply
 66 int pos_mul( int a, int b ){
 67   int c = 0x8000;
 68   int re = a;
 69   while( (c>>=1) && (!(b&c)) );
 70   while( c >>= 1 ){
 71     re <<= 1;
 72     if( c&b )
 73     re = add(re, a);
 74   }
 75   return re;
 76 }
 77 
 78 // multiply
 79 int mul( int a, int b ){
 80   if (iszero(a) || iszero(b)) return 0;
 81   if (ispos(a) && ispos(b))
 82     return pos_mul(a, b);
 83   if (isneg(a)) {
 84     if (isneg(b)) {
 85       return pos_mul(rev(a), rev(b));
 86     }
 87     return rev(pos_mul(rev(a), b ));
 88   }
 89   return rev(pos_mul(a, rev(b)));
 90 }
 91 
 92 // two positive numbers divide
 93 int pos_div(int a, int b) {
 94   int re = 0, temp = b;
 95   if(isbig_pos(b, a)) return 0;
 96   do {
 97     temp <<= 1;
 98   }
 99   while (!isbig_pos(temp, a));
100   while (isbig_pos(temp, b)) {
101     re <<= 1;
102     temp >>= 1;
103     if (!isbig_pos(temp, a)) {
104       a = sub(a, temp);
105       re = add(re, 1);
106     }
107   }
108   return re;
109 }
110 
111 // divide
112 int idiv( int a, int b ){
113   if (iszero(b)) {
114     cout << "error" << endl;
115     exit(1);
116   }
117   if (iszero(a)) return 0;
118   if (ispos(a)){
119     if (ispos(b))
120       return pos_div(a, b);
121     return rev(pos_div(a, rev(b)));
122   }
123   if (ispos(b))
124     return rev(pos_div( rev(a), b));
125   return pos_div(rev(a), rev(b));
126 }
127 
128 int main () {
129   int a, b;
130   while (cin >> a >> b) {
131     if (isbig(a,b)&&(a<=b)) cout << "big error" << endl;
132     if (add(a,b) != (a+b)) cout << "add error" << endl;
133     if (sub(a,b) != (a-b)) cout << "sub error" << endl;
134     if (mul(a,b) != (a*b)) cout << "mul error" << endl;
135     if (idiv(a,b) != (a/b)) cout << "div error" << endl;
136   }
137   return 0;
138 } 
原文地址:https://www.cnblogs.com/siceblue/p/2590597.html