位运算与四则运算

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

(怎么还押韵了呢?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值