`
BrokenDreams
  • 浏览: 253749 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:100044
社区版块
存档分类
最新评论

不用加减符号实现加减法

 
阅读更多
        今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
        分析一下,先看最简单的情况,假设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));
	}


        这是群友给的答案,有点意思,记录一下。
分享到:
评论

相关推荐

    组成原理课程设计::功能:实现逻辑运算(逻辑非,逻辑加。。)定点整数的单符号位补码加减法,定点整数的原码一位乘法,浮点数的加减运算

    在单符号位补码加减法中,我们需要考虑溢出的情况,即当两个负数相加或者两个正数相减可能导致结果超出可表示的范围。为了处理这种情况,我们需要对加法结果进行循环移位,并检查符号位是否与进位位一致,如果不一致...

    计算机组成原理实验报告-八位补码加减法器的设计与实现.pdf

    计算机组成原理实验报告的核心内容是设计与实现一个八位补码加减法器,这是计算机硬件基础中的关键部分。补码是一种表示有符号整数的方法,广泛用于计算机系统中进行算术运算。在这个实验中,学生需要理解算术逻辑...

    scratch加减法混合运算器电子学会图形化编程scratch等级考试四级真题解析2020-12.pdf

    8. 加减混合运算器的实现:scratch语言中可以实现加减混合运算器,自动计算出算式结果。在该资源中,加减混合运算器被用于实现加减混合运算算式的计算。 9. 程序设计和实现:scratch语言中可以使用程序设计和实现,...

    线性表设计100位以内的长整数加减运算的程序

    通过链表,可以实现长整数的加减运算。例如,在加法运算中,可以使用链表来存储两个长整数的各个数字,然后逐位相加,最后输出结果。类似地,在减法运算中,也可以使用链表来存储两个长整数的各个数字,然后逐位相减...

    十六进制加减法 16进制加减法工具

    在这个“十六进制加减法工具”中,用户可以执行两个十六进制数的加法或减法运算,同时得到的结果会以两种形式展示:十六进制和十进制。这样设计的原因在于,虽然十六进制在表示二进制数据时更为直观,但十进制在人类...

    基于proteus的C51计算器功能实现加减乘除

    本主题“基于Proteus的C51计算器功能实现加减乘除”涉及到的是如何使用C语言编程,通过C51单片机实现一个基本的计算器,具备加、减、乘、除四种基本运算功能。下面将详细介绍这个过程中的关键知识点。 1. **C51编程...

    8位原码加减法器电路的设计.ms14

    用multisim实现8位原码加减法器 1、 设计一个8位运算器电路,该电路可实现Y=±A±B,即可实现±A±B,也可实现B±A。其输入数据A、B为原码,其中高1位为符号位,低7位为数据位,运算结果Y需要转换为原码表示。 2、 ...

    能够实现逻辑运算(逻辑非、逻辑加、逻辑乘、逻辑异)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算

    - **补码加减运算**:定点整数的加减运算要考虑符号位,因为补码不仅包含数值部分,还包括表示正负的符号位。相同符号的两数相加会得到一个较大绝对值的数,不同符号的两数相加会进行减法运算。需要注意溢出的情况,...

    五年级数学下册分数加减混合运算综合练习题100.pdf

    在进行混合运算时,需要注意运算顺序和运算符号,特别是乘除法要优先于加减法。如果题目中没有特别的括号或者运算顺序要求,一般按照从左到右的顺序依次进行计算。 在进行分数加减运算时,还需要注意到结果的化简。...

    Java编写的计算器图形界面实现加减乘除带括号运算

    Java编写的计算器图形界面实现加减乘除带括号运算 版本1.0 1、图形化界面 2、计算器显示部分分为两个区域:第一行显示输入将要计算的数值及符号,第二行显示结果,第一行字体要小,第二行字体要大,且加粗。 ...

    C语言移位实现加减乘除

    ### C语言移位实现加减乘除 #### 概述 在计算机科学中,移位操作是一种高效且基本的操作方式,常被用于替代传统的算术运算。本文将深入探讨如何利用C语言中的移位操作来实现加减乘除四种基本运算,并通过具体的...

    易语言利用乐玩模块识别加减法验证码

    在本案例中,我们将探讨如何利用易语言结合乐玩模块来识别加减法验证码。 乐玩模块是易语言的一个扩展模块,提供了丰富的图形用户界面(GUI)组件和功能,如图像处理、网络通信等,这些对于验证码识别非常有用。加...

    20以内加减法练习题-A4排版-可直接打印.pdf

    但根据常识,我们可以推测这些数字和加减符号组合起来,应该是一系列的加法或减法练习题,例如“8 + 5 = ”、“15 - 7 = ”等。这类练习题在小学一年级或二年级的数学教育中非常常见,用于帮助学生掌握基本的数学...

    人教版五年级数学下册分数加减法解方程.pdf

    在解决分数相关问题时,学生需要掌握分数的加减运算规则,包括通分、约分以及加减法的基本步骤。 2. 分数加减法运算:从文档的【部分内容】可以看出,涉及了分数的加减运算,例如“2x+8181818”可能表示将一个未知...

    8位行波进位加减法器

    补码运算在计算机内部用于表示和处理有符号数,其优越性在于能够简化加减法运算,使得加法和减法运算可以通过相同的电路实现,从而优化硬件设计,提高计算效率。 #### 补码加减法运算规则及溢出判别 补码运算遵循...

    大数加减乘类的实现

    本项目实现了一个大数加减乘的类,结合链表数据结构来存储和处理这些大数。 首先,我们来讨论大数的基本概念。在计算机中,常规的数据类型如int、long等都有其最大值和最小值限制,例如在Java中,int的最大值为2^31...

    multisim 8位补码加减法器电路.ms14

    1、设计一个能够完成8位补码加减法运算器,采用8位数据总线结进行数据的输入、输出。利用行波(串行)进位的方式,并具备数据锁存功能和溢出判断功能。 2、输入数据为补码,其中高1位为符号位,低7位为数据位,运算...

    C语言:一元多项式加减法运算(链表 附答案).docx

    《C语言实现一元多项式加减法运算的链表方法》 在计算机科学中,数据结构和算法是解决问题的基础工具。本篇文章将探讨如何使用C语言通过链表实现一元多项式的加减法运算。这是一道适合初学者的链表实践题目,通过这...

    计算机组成原理之补码加减运算器

    我们可以使用加法器来实现无符号数的加减运算。无符号数的加减运算可以分为两步:首先,计算x+y,可以直接按位相加;其次,计算x-y,可以把减数y全部按位取反,然后末位加1,得到负y的补码,最后把减法变换成加法。 ...

    verilog 编写的32位加减法器

    在这个32位加减法器项目中,Verilog被用来实现一个能够执行32位整数加法和减法操作的电路。以下是关于这个项目的一些关键知识点: 1. **Verilog基础知识**: - Verilog是一种文本表示,用来描述数字逻辑系统的结构...

Global site tag (gtag.js) - Google Analytics