【剑指Offer学习】【面试题47:不用加减乘除做加法】
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。
解题思路
5 的二进制是101, 17 的二进制是10001 。还是试着把计算分成三步:第一步各位相加但不计进位。 得到的结果是10100 ( 最后一位两个数都是1,相加的结果是二进制的10 。这一步不计进位, 因此结果仍然是0 。
第二步记下进位。在这个样例中仅仅在最后一位相加时产生一个进位,结果是二进制的10 。 第三步把前两步的结果相加,得到的结果是10110 , 转换成十进制正好是22。由此可见三步走的策略对二进制也是适用的。
接下来我们试着把二进制的加法用位运算来替代。第一步不考虑进位对每一位相加。0加0 、1加1的结果都0。
0加1 、1 加0的结果都是1 。我们注意到。这和异或的结果是一样的。对异或而言, 0和0、1和1异或的结果是0, 而0和1 、1和0的异或结果是1 。接着考虑第二步进位,对加0 、0 加1 、1加0而言, 都不会产生进位。仅仅有1加1 时,会向前产生一个进位。此时我们能够想象成是两个数先做位与运算,然后再向左移动一位。仅仅有两个数都是1的时候。位与得到的结果是1。其余都是0。第三步把前两个步骤的结果相加。第三步相加的过程依旧是反复前面两步, 直到不产生进位为止。
算法实现
public class Test47 {
public static int add(int x, int y) {
int sum;
int carry;
do {
sum = x ^ y;
// x&y的某一位是1说明。它是它的前一位的进位,所以向左移动一位
carry = (x & y) << 1;
x = sum;
y = carry;
} while (y != 0);
return x;
}
public static void main(String[] args) {
System.out.println(add(1, 2) + ", " + (1 + 2));
System.out.println(add(13, 34)+ ", " + (13 + 34));
System.out.println(add(19, 85)+ ", " + (19 + 95));
System.out.println(add(865, 245)+ ", " + (865 + 245));
}
}
执行结果
【剑指Offer学习】【面试题47:不用加减乘除做加法】的更多相关文章
- 【剑指offer】面试题 65. 不用加减乘除做加法
面试题 65. 不用加减乘除做加法 题目描述 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. Java 实现 public class Solution { ...
- 《剑指offer》面试题65. 不用加减乘除做加法
问题描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. 示例: 输 ...
- 剑指offer四十八之不用加减乘除做加法
一.题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 二.思路 1. 采用位运算的方法,分三步: (1).两个数异或:相当于每一位相加,而不考虑进位 (2).两个数 ...
- Python 解决面试题47 不用加减乘除做加法
在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于 ...
- 剑指Offer(书):不用四则运算做加法
题目:写一个函数,求两个整数之和,不得使用四则运算位运算. package com.gjjun.jzoffer; /** * 写一个函数,求两个整数之和,不得使用四则运算 * * @author gj ...
- (剑指Offer)面试题47:不用加减乘除做加法
题目: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路: 很容易想到通过位运算来解决问题. 以5+17=22为例,参考十进制加法:1.只做各位相加不进位运算,即得 ...
- 《剑指offer》面试题47. 礼物的最大价值
问题描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...
- 《剑指offer》面试题的Python实现
<剑指Offer>是很多程序员面试前要看的书,但里面的算法都是基于C++实现的,最近用了三周左右时间,用Python完成了里面几乎所有的算法题,由于时间以及个人水平均有限,或许会有部分问题 ...
- 【剑指Offer学习】【全部面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...
- 【剑指Offer学习】【所有面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代 ...
随机推荐
- python中return和print的区别(详细)
huskiesir最近在研究python哈,今天纠结一个问题,那就是return和print的区别,都是可以输出结果的,到底有啥区别呀?二话不多说,看下面的例子. #代码1: def break_wo ...
- Python 绘图与可视化 matplotlib 填充fill和fill_between
参考链接:https://blog.csdn.net/You_are_my_dream/article/details/53457960 fill()填充函数曲线与坐标轴之间的区域: x = np.l ...
- Vue经典开源项目
Vue常用的开源项目和插件库 UI组件 element ★34,784 - 饿了么出品的基于Vue2的web UI工具套件storybook ★33,503 - 响应式UI 开发及测试环境Vux ★1 ...
- CSLA框架的codesmith模板改造
一直有关注CSLA框架,最近闲来无事,折腾了下,在最新的r3054版本基础上修改了一些东西,以备自己用,有兴趣的园友可以下载共同研究 1.添加了默认的授权规则 如果是列表对象则生成列表权限,User的 ...
- [AngularJS]Chapter 5 与服务器交互
第八章有关于缓存的东西. [通过$http交互] 传统的AJAX请求如下 var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange ...
- POJ 2447
挺水的一题.其实只要理解了RSA算法,就知道要使用大整数分解的方法来直接模拟了. 不过,要注意两个INT64的数相乘来超范围 #include <iostream> #include &l ...
- "singleTask"模式 切换到新的栈中
本文截取了网络资源的结论部分 对singletask 启动模式做笔记记录. 尽管SubActivity的launchMode被设置为"singleTask"模式,可是它并不像官方文 ...
- linux下挂载ISCSI存储设备
安装 首先要在存储设备上做好RAID,设置好iSCSI 目标方(target). 这里主要说明iSCSI initiator的安装. 不同的操作系统对应各自的iSCSI initiator,以Redh ...
- 极客时间 mysql实战45讲下载读 08讲事务到底是隔离的还是不隔离的 笔记
笔记体会: 1.innodb支持RC和RR隔离级别实现是用的一致性视图(consistent read view) 2.事务在启动时会拍一个快照,这个快照是基于整个库的.基于整个库的意思就是说一个事务 ...
- JavaScript实现双向链表
title: JavaScript实现双向链表 toc: false date: 2018-10-07 10:11:36 append(element): 添加元素到链表尾部 insert(posit ...