通过位运算求两个数的和(求解leetcode:371. Sum of Two Integers)
昨天在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)的更多相关文章
- 剑指offer用位运算实现两个数相加,及python相关的位操作
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution: def Add(self ...
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1
转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...
- 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 -. ...
- 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 ...
- 【C语言】求两个数中不同的位的个数
//求两个数中不同的位的个数 #include <stdio.h> int count_different(int a, int b) { int count = 0; int c = a ...
- C语言学习笔记之位运算求余
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是2的N次方幂时才有效. ...
- 求两个数中的较大值max(a,b)。(不用if,>)
题目:求两个数的较大值,不能使用if.>. 1.不使用if.>,还要比较大小,貌似就只能使用条件表达式: x=<表达式1>?<表达式2>:<表达式3>; ...
- [note]一类位运算求最值问题
[note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻 ...
- c语言小技巧:C语言学习笔记之位运算求余
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不 允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注 意:该方法只对除数是2的N次方幂时才有效 ...
随机推荐
- HDU 6186 CS Course(前缀+后缀)
http://acm.hdu.edu.cn/showproblem.php?pid=6186 题意:给出n个数,共有n次询问,每次询问给出一个数p,求除去第p个数后的n-1个数的&.|.^值. ...
- Android 按钮响应事件的几种方式
目录 1.在布局中指定onClick属性 2.使用匿名内部类 3.在当前Activity中实现OnClickListener接口 4.创建内部类 1.在布局中指定onClick属性 布局代码 < ...
- JAVA深入研究——Method的Invoke方法(转)
原文地址:http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一 ...
- NYOJ 542 试制品(第五届河南省省赛)
解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h ...
- Python 编程第一步
Python 编程第一步 在前面的教程中我们已经学习了一些 Python3 的基本语法知识,下面我们尝试来写一个斐波纳契数列. # Fibonacci series: 斐波纳契数列 # 两个元素的总 ...
- PHP7&Swoole源码安装
PHP7源码安装 1.获取PHP http://php.net/downloads.php 2.解压 tar -xjvf php-7 (根据压缩包的格式修改命令 如果时间戳有问题 -m) 3. ./c ...
- Type I and type II errors | 第一类错误和第二类错误
偶尔能看懂,但是死活记不住,归根结底是没有彻底理解! Type I and type II errors - wiki type I error is the rejection of a true ...
- hdu-1043 bfs+康拓展开hash
因为是计算还原成一种局面的最短步骤,应该想到从最终局面开始做bfs,把所有能到达的情况遍历一遍,把值存下来. bfs过程中,访问过的局面的记录是此题的关键,9*9的方格在计算过程中直接存储非常占内存. ...
- hdu6133 Army Formations 线段树合并
给你一棵有n个节点的二叉树,每个节点有一个权值,对于一棵子树u,将u的子树中的节点权值从大到小排序,令sz[u]为子树u的大小, 则ans[u] = 1 * a[1] + 2 * a[2] + ... ...
- js 把一个对象赋值给另一个对象会指向同一个内存地址
先看一段代码: var arr1 = [1,2,3]; var arr2 = arr1; arr2.push(4); console.log(arr1)//[1,2,3,4] 为什么会输出 的是[1, ...