位运算————两整数之和

在位运算操作中,异或的一个重要特性是无进位加法

a = 5 = 0101
b = 4 = 0100

a ^ b 如下:

0 1 0 1
0 1 0 0
-------
0 0 0 1

得到了一个无进位加法结果,如果要得到 a + b 的最终值,我们还要找到进位的数,把这二者相加。在位运算中,我们可以使用与操作获得进位:

a = 5 = 0101
b = 4 = 0100

a & b 如下:

0 1 0 1
0 1 0 0
-------
0 1 0 0

由计算结果可见,0100 并不是我们想要的进位,1 + 1 所获得的进位应该要放置在它的更高位,即左侧位上,因此我们还要把 0100 左移一位,才是我们所要的进位结果。

那么问题就容易了,总结一下:

  • a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
  • 无进位加法使用异或运算计算得出
  • 进位结果使用与运算和移位运算计算得出
  • 循环此过程,直到进位为 0
 1 class Solution {
 2 public:
 3     int getSum(int a, int b) {
 4         //a为异或结果,无进位
 5         //b为与救过,进位的位置-1,所以要<<1
 6         //直到进位为0
 7         while(b){
 8             int tmp=a^b;
 9             b = ((unsigned int)a&b)<<1;//unsinged 防止整型溢出,变成无符号就可以防止有符号整型的溢出了
10             a = tmp;
11         }
12         return a;
13     }
14 };

原文地址:https://www.cnblogs.com/pacino12134/p/11052038.html

时间: 2024-08-30 16:53:50

位运算————两整数之和的相关文章

LeetCode|371. 两整数之和

题目描述 等级: 简单 不使用运算符 和 - ,计算两整数a .b之和. 示例1: 输入: a = 1, b = 2 输出: 3 示例2: 输入: a = -2, b = 3 输出: 1 思路 对于位运算的考察. 在位运算中,异或操作获取的是两个数的无进位和,异或:相同为0,不同为1. 如, 2^3 0010 ^ 0011 ------- 0001 我们知道,2 3=5,5的二进制是0101.前面已经知道了无进位和,下面获取进位的数: 看a 原文地址:https://www.cnblogs.co

[Swift]LeetCode371. 两整数之和 | 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. Credits:Special thanks to @fujiaozhu for adding this problem and creating all test cases. 不使用运算符 + 和 - ???????,计算

【leetcode 简单】 第八十七题 两整数之和

不使用运算符 + 和-,计算两整数a .b之和. 示例: 若 a = 1 ,b = 2,返回 3. class Solution: def getSum(self, a, b): """ :type a: int :type b: int :rtype: int """ # return sum([a,b]) first=a^b second=(a&b)<<1 return sum([first,second]) 参考:htt

位运算实现整数运算

不准用+,-,*,/ 运算操作符来实现四则运算. 1.整数加法 https://leetcode.com/problems/sum-of-two-integers/ int add(int a, int b) { int ans = a; while (b) {//直到没有进位 ans = a ^ b; //不进位加法 b = ((a & b) << 1); //所有a,b都为1的位,都存在进位,记录该进位,下一次循环加上 a = ans; } return ans; } 链接的题目需

C 碎片九 预处理&amp;位运算&amp;文件

一.预处理 ////用宏 定义 两个带参数的宏  求 两个数的较大值 和 较小值 #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b //宏定义 必须要在同一行 //打印出最大值 #define max2(a,b) if(a>b){\ printf("%d\n",a);\ }else{\ printf("%d\n",b);\ } // '\'在预处理阶段表示 连接符  把下一行代码和当前行连接成同一行

位运算(AcWing.800)

首先先讲位运算两个比较重要的知识点 求n的第K位数字:n>>k&1 返回n的最后一位1 :lowbit(n)=n&-n; #include<iostream> using namespace std; int n; const int N = 100010; int a[N]; int lowbit(int n) { return n&-n; } int main() { cin>>n; for(int i=0;i<n;i++) { int

位运算和关于两个数交换的多种方法

我们知道,位运算在计算中有着广泛的应用. 在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中. 以下我们就来介绍一下位运算. 1.左移运算<<  左移右移都是移动二进制数 0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0) 0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位 0000-0000 0000-0000

不用【加减乘除】求两个整数之和

首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的.实际上,我们可以分成三步进行: 只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1): 做进位,5+7中有进位,进位的值是10;第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22. 我们一直在想,求两数之和四则运算都不能用,那还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了.位运算是针对二进制的,我们就以二进制再来分析一下前面的三步走

Java两整数相除保留两位小数

在Java中 两个整数相除 会做取整运算,此时如果希望得到运算结果为浮点数 则必须将两整数其一或两者都强制转为为浮点数 例如: int a = 9; int b = 2; System.out.println((float)a/b); System.out.println(a/(float)b); System.out.println((float)a/(float)b); 保留两位小数 DecimalFormat df = new DecimalFormat("0.00"); Str