1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 位运算符实现加法和乘法

位运算符实现加法和乘法

时间:2022-06-25 13:28:07

相关推荐

位运算符实现加法和乘法

文章目录

加法:乘法:问题1:问题2:

加法:

#include <iostream>using namespace std;int main(){int x, y;cin >> x >> y;int z = x ^ y;int d = x & y;if (d) {while (d) {int end = (d << 1);d = (end & z);z = (end ^ z);}printf("%d",z);}else {printf("%d", z);}}

异或本身就是不进位的加法,用异或之后然后进行是否有需要进位的判断,如果需要进位的话,那么进行左移一位(因为进位是进前一位),进位完后,进行异或相加,加完之后需要再次判断是否有进位(因为一次相与只判断一次相加进位),并不能代表进位一次后不存在第二次进位,或者第三次比如:二进制1111+0001,就需要进位4次

乘法:

#include <iostream>using namespace std;int main(){int x, y,z,input,inputs;cin >> input >> inputs;x = inputs;y = inputs;for (int i = 0; i <input-1; i++) {z = x ^ y;int d = x & y;//d=4int ands;if (d) {while (d) {int end = (d << 1);d = (end & z);z = (end ^ z);}x = z;}else {x = z;}}printf("%d", x);}

乘法的问题有点多的,我调了半小时,问题如下:

问题1:

z = (end ^ z);

这行代码起初我直接用个新的ands变量来接收,那样的话,第二次异或的时候仍然异或的是z = x ^ y;这个变量,那样的话,只异或一次是对的,异或两次以上,直接出错

问题2:

d = (end & z);z = (end ^ z);

这两行代码顺序不能颠倒,颠倒之后算出值为负数,因为循环指定是d值判断,d又是靠之前的z值,而不是计算后的z值

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。