1.加法
相异(^)时,本位为1,进位为0;同为1时本位为0,进位为1;同为0时,本位进位均为0.
所以计算加法的思路为:
1.本位:是否相异——异或运算
2.进位:是否同为1——与运算
- 迭代代码:
#include<stdio.h>
main() {
int a, b,s;
scanf_s("%d %d", &a, &b);
printf("%d", a + b);
while (b) {//
s = a ^ b;
b = (a & b) << 1;//计算进位,“进一位”就是左移一位
a = s;
}
printf("%d", s);
}
- 递归代码:
#include<stdio.h>
int add(int x, int y) {
if (y) {
return add(x ^ y, (x & y << 1));//本位+进位
}
else {
return x;
}
}
main() {
int a, b,s;
scanf_s("%d %d", &a, &b);
printf("%d", a + b);
s = add(a, b);
printf("%d", s);
}
2.减法
a-b=a+(-b)
求相反数,即将各位取反加1
- 递归版:
#include<stdio.h>
int negative(int m) {
int n;
n = add(~m, 1);
return n;
}
int add(int a, int b) {
if (b) {
return add(a^ b, (a & b << 1));//本位+进位
}
else {
return a;
}
}
int minus(int x, int y) {
return add(x, negative(y));
}
main() {
int a, b,s;
scanf_s("%d %d", &a, &b);
printf("%d", a - b);
s = minus(a, b);
printf("%d", s);
}
- 迭代版
#include<stdio.h>
int negative(int m) {
int n;
n = ~m+1;
return n;
}
main() {
int a, b,s;
scanf_s("%d %d", &a, &b);
printf("%d", a - b);
int c = negative(b);
while (c) {
s = a ^ c;
c = (a & c) << 1;
a = s;
}
printf("%d", s);
}
3.乘法
通过加法计算将b个a相加
#include<stdio.h>
int add(int x, int y) {
if (y) {
return add(x ^ y, (x & y << 1));//本位+进位
}
else {
return x;
}
}
main() {
int a, b,s;
scanf_s("%d %d", &a, &b);
printf("%d", a * b);
s = 0;
while (b) {
s = add(s, a);
}
printf("%d", s);
}
4.除法
除法运算是乘法的逆。看a最多能减去多少个b
(怎么还押韵了呢?)