资源描述:
《位运算实现加减乘除、求补、比较、正负判断》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、维唯为为_博客园·博客园·首页·博问·闪存·新随笔·联系·订阅·管理随笔-150文章-1评论-5位运算实现加减乘除、求补、比较、正负判断位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。1.整数的加法viewplain1.intMyAdd(inta,intb)2.{3.for(inti=1;i;i<<=1)4.if(b&i)5.for(intj=i;j;j<<=1)6.if(a&j)a&=~j;7.else{a
2、=j;break;}8.returna;9.}我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连
3、续的1变为0,原先a中为0的位置最低那一位变为1。在不同的位上加1,那就是从相应的位开始向左计算,右边不变。下面还有一个网上的思路,我觉得这个更好:viewplain1.intAddWithoutArithmetic(intnum1,intnum2)2.{3.if(num2==0)returnnum1;//没有进位的时候完成运算1.intsum,carry;2.sum=num1^num2;//完成第一步没有进位的加法运算3.carry=(num1&num2)<<1;//完成第二步进位并且左移运算4.returnAddWithoutArithmetic
4、(sum,carry);//进行递归,相加5.}简化一下:viewplain1.intAdd(inta,intb){b?returnAdd(a^b,(a&b)<<1):returna;}上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。2.整数的减法这个和加法一样了,首先取减数的补码,然后相加。viewplain1.intMyMinus(inta,intb)2.{3.for(inti=1;i&&((b&i)==0);i<<=1);4.for(i<<=1;i;i<<=1)b^=i;5.returnMyAdd(a,b);6
5、.}3.整数的乘法乘法就是将乘数写成(2^0)*k0+(2^1)*k1+(2^2)*k2+...+(2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。viewplain1.intMyMul(inta,intb)2.{3.intans=0;4.for(inti=1;i;i<<=1,a<<=1)5.if(b&i)6.ans+=a;7.returnans;8.}4.整数除法(正整数)除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的
6、数量。viewplain1.intMyDiv(intx,inty)2.{3.intans=0;4.for(inti=31;i>=0;i--)5.{6.//比较x是否大于y的(1<>i)>=y)8.{9.ans+=(1<
7、========================================================================================加减乘除位运算//程序中实现了比较大小、加减乘除运算。所有运算都用位操作实现//在实现除法运算时,用了从高位到低位的减法//具体如下,算法也比较简单,所以没有作注释#includeusingnamespacestd;//加法intadd(inta,intb){intc;while(c=(a&b)){a=(a^b);b=(c<<1);}return(a^b);
8、}//求补码intrev(inta){returnadd((~a),1);}//判断正负intispos(inta){//正return(a&0xFFFF)&&!(a&0x8000);}intisneg(inta){//负returna&0x8000;}intiszero(inta){//0return!(a&0xFFFF);}//比较两个正数的大小(非负也可)intisbig_pos(inta,intb){//a>b>0intc=1;b=(a^b);if(iszero(b))return0;while(b>>=1){c<<=1;}return(c&
9、a);}//比较两个数的大小intisbig(inta,intb){//a>bif(isneg(a)){if