今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
第1位的值有4种,0+0=0、1+0=1、0+1=1、1+1=0,这正好符合“异或”的情况。
第2位的值来自于第一位的进位加上本身的值,进位的情况也有4种,0+0=0、1+0=0、0+1=0,1+1=1,这正好符合“与”的情况。
考虑一般性,a+b就等同于a^b + (a&b) << 1,而这又是一个加法,可递归求解,出口就是当进位为0的时候。
看个例子:
11+2
转为二进制,套用上面公式分析:
1011 + 0010
=1001 + 0100
=1101 + 0000
=1101
结果转为10进制为13
可以自己在草稿纸上多看看例子观察下。
所以Java代码实现如下:
public static int add(int a, int b){
return b == 0 ? a : add(a ^ b ,(a & b) << 1);
}
那么减法怎么搞呢?减法也能用加法表示嘛,比如a-b就等于a+(-b),但不能出现负号,我们知道Java中整型数值编码方式为补码,所以一个数对应的负数就这个数“取反加1”,so 代码如下:
public static int sub(int a, int b){
return add(a, add(~b, 1));
}
这是群友给的答案,有点意思,记录一下。
分享到:
相关推荐
在单符号位补码加减法中,我们需要考虑溢出的情况,即当两个负数相加或者两个正数相减可能导致结果超出可表示的范围。为了处理这种情况,我们需要对加法结果进行循环移位,并检查符号位是否与进位位一致,如果不一致...
计算机组成原理实验报告的核心内容是设计与实现一个八位补码加减法器,这是计算机硬件基础中的关键部分。补码是一种表示有符号整数的方法,广泛用于计算机系统中进行算术运算。在这个实验中,学生需要理解算术逻辑...
8. 加减混合运算器的实现:scratch语言中可以实现加减混合运算器,自动计算出算式结果。在该资源中,加减混合运算器被用于实现加减混合运算算式的计算。 9. 程序设计和实现:scratch语言中可以使用程序设计和实现,...
通过链表,可以实现长整数的加减运算。例如,在加法运算中,可以使用链表来存储两个长整数的各个数字,然后逐位相加,最后输出结果。类似地,在减法运算中,也可以使用链表来存储两个长整数的各个数字,然后逐位相减...
在这个“十六进制加减法工具”中,用户可以执行两个十六进制数的加法或减法运算,同时得到的结果会以两种形式展示:十六进制和十进制。这样设计的原因在于,虽然十六进制在表示二进制数据时更为直观,但十进制在人类...
本主题“基于Proteus的C51计算器功能实现加减乘除”涉及到的是如何使用C语言编程,通过C51单片机实现一个基本的计算器,具备加、减、乘、除四种基本运算功能。下面将详细介绍这个过程中的关键知识点。 1. **C51编程...
用multisim实现8位原码加减法器 1、 设计一个8位运算器电路,该电路可实现Y=±A±B,即可实现±A±B,也可实现B±A。其输入数据A、B为原码,其中高1位为符号位,低7位为数据位,运算结果Y需要转换为原码表示。 2、 ...
- **补码加减运算**:定点整数的加减运算要考虑符号位,因为补码不仅包含数值部分,还包括表示正负的符号位。相同符号的两数相加会得到一个较大绝对值的数,不同符号的两数相加会进行减法运算。需要注意溢出的情况,...
在进行混合运算时,需要注意运算顺序和运算符号,特别是乘除法要优先于加减法。如果题目中没有特别的括号或者运算顺序要求,一般按照从左到右的顺序依次进行计算。 在进行分数加减运算时,还需要注意到结果的化简。...
Java编写的计算器图形界面实现加减乘除带括号运算 版本1.0 1、图形化界面 2、计算器显示部分分为两个区域:第一行显示输入将要计算的数值及符号,第二行显示结果,第一行字体要小,第二行字体要大,且加粗。 ...
### C语言移位实现加减乘除 #### 概述 在计算机科学中,移位操作是一种高效且基本的操作方式,常被用于替代传统的算术运算。本文将深入探讨如何利用C语言中的移位操作来实现加减乘除四种基本运算,并通过具体的...
在本案例中,我们将探讨如何利用易语言结合乐玩模块来识别加减法验证码。 乐玩模块是易语言的一个扩展模块,提供了丰富的图形用户界面(GUI)组件和功能,如图像处理、网络通信等,这些对于验证码识别非常有用。加...
但根据常识,我们可以推测这些数字和加减符号组合起来,应该是一系列的加法或减法练习题,例如“8 + 5 = ”、“15 - 7 = ”等。这类练习题在小学一年级或二年级的数学教育中非常常见,用于帮助学生掌握基本的数学...
在解决分数相关问题时,学生需要掌握分数的加减运算规则,包括通分、约分以及加减法的基本步骤。 2. 分数加减法运算:从文档的【部分内容】可以看出,涉及了分数的加减运算,例如“2x+8181818”可能表示将一个未知...
补码运算在计算机内部用于表示和处理有符号数,其优越性在于能够简化加减法运算,使得加法和减法运算可以通过相同的电路实现,从而优化硬件设计,提高计算效率。 #### 补码加减法运算规则及溢出判别 补码运算遵循...
本项目实现了一个大数加减乘的类,结合链表数据结构来存储和处理这些大数。 首先,我们来讨论大数的基本概念。在计算机中,常规的数据类型如int、long等都有其最大值和最小值限制,例如在Java中,int的最大值为2^31...
1、设计一个能够完成8位补码加减法运算器,采用8位数据总线结进行数据的输入、输出。利用行波(串行)进位的方式,并具备数据锁存功能和溢出判断功能。 2、输入数据为补码,其中高1位为符号位,低7位为数据位,运算...
《C语言实现一元多项式加减法运算的链表方法》 在计算机科学中,数据结构和算法是解决问题的基础工具。本篇文章将探讨如何使用C语言通过链表实现一元多项式的加减法运算。这是一道适合初学者的链表实践题目,通过这...
我们可以使用加法器来实现无符号数的加减运算。无符号数的加减运算可以分为两步:首先,计算x+y,可以直接按位相加;其次,计算x-y,可以把减数y全部按位取反,然后末位加1,得到负y的补码,最后把减法变换成加法。 ...
在这个32位加减法器项目中,Verilog被用来实现一个能够执行32位整数加法和减法操作的电路。以下是关于这个项目的一些关键知识点: 1. **Verilog基础知识**: - Verilog是一种文本表示,用来描述数字逻辑系统的结构...