位运算实现加减乘除
来源:互联网 发布:jquery.superslide.js 编辑:程序博客网 时间:2024/04/29 19:25
#include <stdio.h>#include <limits.h>//加法运算int add(int a, int b){return b==0 ? a: add(a^b,(a&b)<<1);}//补码中正数转负数的原理int negative(int a){return add(1,~a);}//减法运算int sub(int a,int b){return add(a,negative(b));}//判断正负bool isNegative(int a){return (a&INT_MIN)!=0; //INT_MIN只有最高位为1,其余位为0}//仅计算正数乘法int multi_help(int a,int b) { int result= 0; while(b) { if(b&1) result = add(result, a); a <<=1; b >>= 1; } return result; } //乘法int multi(int a,int b){if(isNegative(a)){if(isNegative(b))return multi_help(negative(a),negative(b));elsereturn negative(multi_help(negative(a),b));}else{if(isNegative(b))return negative(multi_help(a,negative(b)));elsereturn multi_help(a,b);}}//仅计算正数除法int div_help(int a,int b) { if(a<b) return 0;if(a==b) return 1; int result=0; //第32位为符号位,所以从第31位开始 for(int i=30;i>=0;i--) { if((a>>i)>=b) { result=add(result,1<<i); a=sub(a,b<<i); } } return result; }//除法int div(int a,int b){if(isNegative(a)){if(isNegative(b))return div_help(negative(a),negative(b));elsereturn negative(div_help(negative(a),b));}else{if(isNegative(b))return negative(div_help(a,negative(b)));elsereturn div_help(a,b);}}int main(void){int a,b;a=-30;b=-5;printf("ADD:%d,SUB:%d,MULTI:%d,DIV:%d",add(a,b),sub(a,b),multi(a,b),div(a,b));return 0;}