另类加法
来源:互联网 发布:网络协议七层模型 编辑:程序博客网 时间:2024/04/27 22:04
如果让我们实现两个整数相加,但是不允许用加号及其它算数运算符,应该怎么实现呢,不能用算数运算,那其实还有一种运算方式就是位运算,关于算数运算大家可以看下位运算简单介绍,那么到底怎样用位运算实现呢,,,其实用两种运算符就可以了,"&" 和 "^"。数据在计算机中都是以二进制的形式来存储的,所以对于没有进位的运算,比如1+2,其实就是这样的
这就相当于异或,所以对于两个整数数a, b如果没有产生进位,我们可以用直接用 ^ 来实现,那么如果产生进位该怎么处理呢,这就要用到 & 运算符了。其实两个数相加我们可以看成是先把每一位上的数进行相加(产生的进位先保留着,不直接算到结果中),然后用加完的数值再加上产生进位的值的大小就是最终的大小,对于产生的进位,我们可以用&来计算。这样我们来看一个例子,3+3;
首先计算两个数相加后每一位上的数值(不包括进位,其实就是异或运算),是这样的
结果是0,然后再计算产生的进位大小(即就是与运算),是这样的
结果是3,也就是说在计算的过程中产生了三个进位,而每一个进位的大小是2(二进制),所以由于进位产生的大小就是3 * 2 = 6;再加上上一步没有进位的值0,所以结果就是6 + 0 = 6;这样我们的整个过程就结束了。然后看一下用代码怎么实现
import java.util.Scanner;/** * Created by zmt on 2016/12/25. */public class Test { private static int a; private static int b; public static void main(String [] args){ Scanner sc = new Scanner(System.in); a = sc.nextInt(); b = sc.nextInt(); System.out.println(addWithoutPlus(a, b)); } private static int addWithoutPlus(int a, int b){ int temp; do{ temp = a & b; a = a ^ b; b = temp << 1; } while(b != 0); return a; }}如果理解了前面的过程描述,代码业界很好理解了,只要就看do while这一块,首先与运算保存两个数产生的进位的个数,然后再异或得到每一位上的数值运算大小,接着给进位的个数右移一位,也就是乘以二,判断进位是否为零,不为零继续用上一步的结果a加上产生的进位,同时得出新的进位个数,直到进位个数为零,即不产生进位,跳出循环。通过与和异或这两种运算符巧妙的实现了两个数的相加过程。核心代码只有三行,但是理解起来并不容易,但是通过整个实现过程去理解代码还是比较容易的。
最后,,,Merry Christmas ! ! ! ! ! !
0 0
- 另类加法
- 另类加法
- 剑指offer——另类加法__(位运算)
- 程序员面试金典:另类加法、单词最近距离
- 《Cracking the Coding Interview程序员面试金典》----另类加法(不得使用+-x/运算符号)
- 加法
- 加法
- 另类Msgbox
- 另类广告
- 另类对联
- 另类饮茶
- 另类图片
- “另类”生意经
- 另类使用
- 另类Msgbox
- 另类名言
- 另类春运
- 另类sharepoint
- MVC框架设计(二)
- js异常Uncaught TypeError: $(...).datagrid is not a function
- Thinkphp 3.1.3中display方法调用其他模块的操作模板的bug
- 必须知道的 Visual Studio 快捷键
- 【opencv 官方教程】翻译2 核心功能 中 图像操作 线性变换 亮度调整 简单绘图
- 另类加法
- 学生成绩管理
- 解决CentOS7下 ifconfig默认不安装的问题
- 整合谷歌分析和AdMob到Unity3D
- 三大框架之Spring(1)
- Python3学习笔记&开发记录
- Python_Python遍历列表的四种方法
- Typescript(3) 表达式和循环
- ucore lab2