博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位操作实现加减乘除
阅读量:5099 次
发布时间:2019-06-13

本文共 2960 字,大约阅读时间需要 9 分钟。

1 // Bit Operation Implements Add, Submit, Multiply, Divide  2 // Use only Integer with little length  3   4 #include 
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 // divide112 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/archive/2012/07/13/2590597.html

你可能感兴趣的文章
RxJava入门优秀博客推荐
查看>>
基于Selenium2+Java的UI自动化(5) - 执行JavaScript脚本
查看>>
bc https://en.wikipedia.org/wiki/Gossip_protocol
查看>>
saltstack---自动化运维平台
查看>>
Java注释@interface的用法【转】
查看>>
妙味——操作元素属性的几种方法
查看>>
Ring 0 Inline Hook
查看>>
Linux man C++ 库函数
查看>>
PE结构对照表
查看>>
复杂性渐近阶的重要性
查看>>
Rectangle and Square(判断正方形、矩形)
查看>>
js数组创建两种方法
查看>>
IOS自得其乐系列(一)-------------------加载动态图片
查看>>
Function Spec
查看>>
关于我 Jake Lin
查看>>
hue简单介绍
查看>>
现代服务业是什么?
查看>>
java学习笔记十——堆和栈的理解
查看>>
css遮罩蒙版效果 分栏效果
查看>>
rule.xml属性概念
查看>>