zoukankan      html  css  js  c++  java
  • 位操作实现加减乘除

      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 } 
  • 相关阅读:
    Spring框架ioc概括
    Hibernate之二级缓存
    Hibernate之HQL
    Hibernate一对多自关联、多对多关联
    数据结构 | 链表:1097 删除重复元素
    数据结构 | 链表:1074
    在pat考试中快速调整Dev-cpp颜色配置
    dijkstra算法的堆优化
    链式前向星-学习笔记
    图的遍历 | 1131地铁图: dfs复杂模拟题
  • 原文地址:https://www.cnblogs.com/siceblue/p/2590597.html
Copyright © 2011-2022 走看看