昨天在leetcode做题的时候做到了371,原题是这样的:

371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

因为之前完全没有在实际练习中使用过位运算,所以刚看到这道题目的时候我的第一反应是

1.用乘除代替加减,但是一想,觉得恐怕不行,因为乘除本质上也是加减法,不可能跳过加减法做运算。

2.然后又想到或许可以转成二进制再用逻辑运算计算?但是问题是转成二进制不难,但是转回来还是得用加减法呀!看来这种方法也不行。

3.于是想到位运算,但是由于对位运算很不熟悉,于是上网搜了一下,得到如下表格:

含义
  
Pascal语言 C语言 Java
按位与 a and b a & b a & b
按位或 a or b a | b a | b
按位异或 a xor b a ^ b a ^ b
按位取反 not a ~a ~a
左移 a shl b a << b a << b
带符号右移 a shr b a >> b a >> b
无符号右移     a>>> b

好吧,其实一看都是一些布尔运算,也不难理解,接下来就是运算问题了。

举个例子试试看怎么算吧,比如3 + 1,该怎么算呢?由于位运算都是基于二进制的也就是3 + 1 = (011) + (001),如果列竖式计算的话就是

    0 1 1

+   0 0 1

-----------

    0 1 0

+   0 1 0

-----------

    1 0 0

看懂了吗?其实就是模拟进位:

1.首先最低位相加是要进一的

2.然后在做第二位的运算

3.以此类推,一直到没有进位为止。

那么必须弄清楚什么时候需要进位,很明显,当同一位上的数字都是1的时候需要进位,进位以后下一位变成1,也就是3 & 1中等于1的地方是需要进位的,然后左一一位,使下一位变成1, 然后下一位需要加的数字就是 3 ^ 1。

C++代码实现如下:

int getSum(int a, int b) {
while(a != ) {
int tmp = (a & b) << ;
b = a ^ b;
a = tmp;
}
return b;
}

通过位运算求两个数的和(求解leetcode:371. Sum of Two Integers)的更多相关文章

  1. 剑指offer用位运算实现两个数相加,及python相关的位操作

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution:    def Add(self ...

  2. 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1

    转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...

  3. Leetcode 371: Sum of Two Integers(使用位运算实现)

    题目是:Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. ...

  4. LeetCode 371. Sum of Two Integers (两数之和)

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  5. 【C语言】求两个数中不同的位的个数

    //求两个数中不同的位的个数 #include <stdio.h> int count_different(int a, int b) { int count = 0; int c = a ...

  6. C语言学习笔记之位运算求余

    我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是2的N次方幂时才有效. ...

  7. 求两个数中的较大值max(a,b)。(不用if,>)

    题目:求两个数的较大值,不能使用if.>. 1.不使用if.>,还要比较大小,貌似就只能使用条件表达式: x=<表达式1>?<表达式2>:<表达式3>; ...

  8. [note]一类位运算求最值问题

    [note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻 ...

  9. c语言小技巧:C语言学习笔记之位运算求余

    我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不 允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注 意:该方法只对除数是2的N次方幂时才有效 ...

随机推荐

  1. resmgr:cpu quantum 等待事件 top 1

    早上看昨天现场的报告,发现晚上七八点,resmgr:cpu quantum 等待事件排在i第一位,如下: 该事件是和资源管理相关的,如果启用资源管理计划,就可能遇到这个问题. 所以常规的解决方案是禁用 ...

  2. rman copy相关

    1.db_file_name_convert备份保持原来文件名一致 backup as copy db_file_name_convert=('/u01/app/oracle/oradata/slnn ...

  3. linux --- 5. nginx 初始

    一. 安装nginx 1.安装nginxz之前的依赖包 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel o ...

  4. Always clear download 下载 谷歌浏览器插件

    由于该博文不支持上传压缩包,因此,如有需要always clear download插件的可点击此链接在百度网盘上下载https://pan.baidu.com/s/13wWchis3iKqXkIA5 ...

  5. Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法

    Qt 程序获取程序所在路径.用户目录路径.临时文件夹等特殊路径的方法 经常我们的程序中需要访问一些特殊的路径,比如程序所在的路径.用户目录路径.临时文件夹等.在 Qt 中实现这几个功能所用的方法虽然都 ...

  6. MapReduce :基于 FileInputFormat 的 mapper 数量控制

    本篇分两部分,第一部分分析使用 java 提交 mapreduce 任务时对 mapper 数量的控制,第二部分分析使用 streaming 形式提交 mapreduce 任务时对 mapper 数量 ...

  7. 【三】jquery之选择器

    转自:https://www.cnblogs.com/youfeng365/p/5846650.html jquery参考手册:http://jquery.cuishifeng.cn/index.ht ...

  8. CentOS7.4安装jdk1.8.0_201、Tomcat-8.5.38环境

    有时候安装一些软件或者服务都需要jdk环境,今天就在centos1.4上安装最新的jdk环境. 检测历时安装 1.查看Linux自带的JDK是否已安装 # java -version 2.查看JDK信 ...

  9. AngularJS服务及注入--Provider

    Provider简介 在AngularJS中,app中的大多数对象通过injector服务初始化和连接在一起. Injector创建两种类型的对象,service对象和特别对象. Service对象由 ...

  10. double 类型转化为Integer

    (1)把double先转化成int类型 Double reseve3=Double.parseDouble(bddet[0].getReserve3()); int b=reseve3.intValu ...