通过位运算求两个数的和(求解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次方幂时才有效 ...
随机推荐
- ES5的完美继承
// 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = functio ...
- 编码原则 之 Explicit Dependencies Principle
Explicit Dependencies Principle The Explicit Dependencies Principle states: Methods and classes shou ...
- python多进程apply与apply_async的区别
为什么会这样呢? 因为进程的切换是操作系统来控制的,抢占式的切换模式. 我们首先运行的是主进程,cpu运行很快啊,这短短的几行代码,完全没有给操作系统进程切换的机会,主进程就运行完毕了,整个程序结束. ...
- 【读书笔记】Cronjob原理及源码分析
原文链接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b40 ...
- linux基础11-bash编程(字符串测试 和 for循环)
练习:传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来.(1)字符测试:==:测试是否相等,相等为真,不等为假!=: 测试是否不等,不等为真,等为假>< ...
- 关于ExpressionChangedAfterItHasBeenCheckedError
最近在stackoverflow上似乎每天都有一些关于angular报错‘ExpressionChangedAfterItHasBeenCheckedError’的问题.发生这些问题通常是由于angu ...
- Django 编写模板并渲染的示例
>>> from django.template import Template, Context >>> raw_template = ""& ...
- linux存储管理之自动挂在
自动挂载 Automount ==================================================================================== ...
- python自动化测试入门篇-jemter连接mysql数据库
jmeter对数据库的操作主要包括以下几个步骤:1.导入mysqlde jdbc的jar包:2.创建数据库连接配置:3.线程组添加jdbc request;4.启动按钮,添加查看结果树 一.准备好驱动 ...
- 解决安卓UI刷新卡屏,只显示最后一处刷新的问题
---恢复内容开始--- 错误1 安卓的机制决定了只有UI线程(也就是主线程)才能更新UI界面 否则会导致UI界面混乱的问题 这就说明了在new Thread中直接showImage是会报“出现非主线 ...