- 加法:
- 乘法:
- 问题1:
- 问题2:
#includeusing namespace std; int main() { int x, y; cin >> x >> y; int z = x ^ y; int d = x & y; int ands; if (d) { while (d) { int end = (d << 1); ands = (end ^ z); d = (end & z); } printf("%d",ands); } else { printf("%d", z); } }
异或本身就是不进位的加法,用异或之后然后进行是否有需要进位的判断,如果需要进位的话,那么进行左移一位(因为进位是进前一位),进位完后,进行异或相加,加完之后需要再次判断是否有进位(因为一次相与只判断一次相加进位),并不能代表进位一次后不存在第二次进位,或者第三次比如:二进制1111+0001,就需要进位4次
#includeusing namespace std; int main() { int x, y,z,input,inputs; cin >> input >> inputs; x = inputs; y = inputs; for (int i = 0; i 乘法的问题有点多的,我调了半小时,问题如下:
问题1:z = (end ^ z);这行代码起初我直接用个新的ands变量来接收,那样的话,第二次异或的时候仍然异或的是z = x ^ y;这个变量,那样的话,只异或一次是对的,异或两次以上,直接出错
问题2:d = (end & z); z = (end ^ z);这两行代码顺序不能颠倒,颠倒之后算出值为负数,因为循环指定是d值判断,d又是靠之前的z值,而不是计算后的z值



