文章目录
加法:乘法:问题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值