不使用加减运算符实现整数加和减

文章目录

进位
进位
加粗

最近想出了不适用运算符实现加与减

在这里插入图片描述

首先按位与找出的是需不需要进位

按位与是两边同时为1,则为1,那么如果两边同时为1的话,是不是就该进位?所以我们用按位与来判断是否需要进位

然后再按位异或找出不同的位数

按位异或是两边不相等,也就是1 和 0的时候才会1,那我如果在整数的二进制为中,一边是0,一边是1,我们是不是直接相加就可以了呢? 那么相加的结果就是1

最后按位或

按位或是两边只要有一个是1,就为1,那么我们是不是可以用这个来实现我们前面按位与和按位异或的结果相加呢?答案是可以的。

但是使用按位或的前提是按位与的结果按位异或的结果,这两个再按位与的结果为0,才可以进行按位或,就和上面那个图一样。

4 – 0000 0100
5 – 0000 0101
4 & 5
0000 0100
不是0再左移一位
0000 1000

----------------------------------------------------分隔栏
4 – 0000 0100
5 – 0000 0101
4 ^ 5
0000 0001

(4 & 5) & (4 ^ 5) == 0
此时直接按位或
0000 1000
0000 0001
按位或
结果为0000 1001
只有当按位与和按位异或按位与的结果为0的时候,才能按位或,不然的话还是有可以进位的,如果不这么继续整的话,就会算错
上图中4,5只是一次就搞定了,下面在举一个 15 和 25 的例子。

在这里插入图片描述
代码实现:

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	while (a & b)
	{
		//创建一个变量存储按位异或的值,不然b的值改变了,
		//那接下来 a = (a & b) << 1的值也不对 
		int c = 0;
		c = a ^ b;
		a = (a & b) << 1;
		b = c;
	}
	printf("%d\n", a | b);
	return 0;
}

在这里插入图片描述

减法也可以

在这里插入图片描述

相关推荐

  1. C# 实现乘除 (备忘)

    2024-04-27 04:44:01       35 阅读
  2. Oracle日期

    2024-04-27 04:44:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 04:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 04:44:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 04:44:01       82 阅读
  4. Python语言-面向对象

    2024-04-27 04:44:01       91 阅读

热门阅读

  1. electron使用typescript

    2024-04-27 04:44:01       33 阅读
  2. 微服务框架ServiceComb

    2024-04-27 04:44:01       28 阅读
  3. UE TArray

    UE TArray

    2024-04-27 04:44:01      34 阅读
  4. TypeScript 学习笔记

    2024-04-27 04:44:01       40 阅读
  5. DataGrip 禁用自动同步

    2024-04-27 04:44:01       31 阅读
  6. 从零学算法134

    2024-04-27 04:44:01       36 阅读