位操作的运算

来源:互联网 发布:苹果切换系统mac系统 编辑:程序博客网 时间:2024/06/06 06:42
//方法一void swap(int &a,int &b){a = a+b;b = a-b;a = a-b;}//方法二void swap(int &a,int &b){a^=b;b^=a;a^=b;}//上述的两种方法中存在共有的bug,即swapI(a,a)时将会发生错误,将a置为0.但是在a等于b 的情况下,//但是a 和b不是指向同一个地址的时候,不会发生错误。也就是,如果交换的对象的两者的地址相同的时候,//将会发生错误。地址不同,不会发生错误。

int Add(int num1,int num2){int add=0;while(num2){add = num1^num2;num2 = (num1&num2)<<1;num1 = add;}return num1;}//num1-num2=num1+(-num2)=num1+(~num2+1)int Sub(int num1,int num2){return Add(num1,Add(~num2,1));}int Multiply(int a,int b){bool neg = (b<0);if(neg)b = -b;int sum = 0;map<int ,int> bit_map;for(int i=0;i<32;i++)bit_map.insert(pair<int ,int>(1<<i,i));while(b>0){int last_bit = bit_map[b& ~(b-1)];//b&~(b-1)得到乘数b的二进制表示中的最右侧的1的位置sum+=a<<last_bit;//last_bit记录被乘数a需要位移的位数b &=(b-1);//将b的二进制表示中的最右侧的1去掉用于下一次乘法}if(neg)sum = -sum;return sum;}int Divid(int a,int b){bool neg=(a>0)^(b>0);if(a<0)a = -a;if(b<0)b = -b;if(a<b)return 0;int msb = 0;//msb记录除数需要左移的位数for(msb=0;msb<32;msb++)if((b<<msb)>=a)break;int q = 0;for(int i=msb;i>=0;i--){if((b<<i)>a)continue;q |=(1<<i);a -=(b<<i);}if(neg)return -q;return q;}


                                             
0 0
原创粉丝点击