用位运算实现加减法

今天学习了一下用位运算实现加减法   由于负数的存储方式是补码的方式   所以实现了加法就是实现了减法

加法运算基于这样的一个定理:

a + b = a^b + ( ( a & b ) << 1)

直到进位或者是和为零的时候就返回就好了

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 int get(int a, int b) {
 7     int c = a ^ b;
 8     int d = ( a & b ) << 1;
 9     if(c == 0 || d == 0) {
10         return c ^ d;
11     }
12     return get(c, d);
13 }
14
15 int main() {
16     int a, b;
17     while(EOF != scanf("%d %d",&a, &b) ) {
18         printf("%d\n", get(a, b) );
19     }
20     return 0;
21 }
时间: 2024-12-24 06:47:35

用位运算实现加减法的相关文章

[模拟]位运算实现加减法

1 /* 2 * 单位加:找与+对应的位运算,分析真值表得出是按位异或^ 3 * 进位:可以用<<进行,但是要判断是否存在进位操作,则需要&来判断. 4 * 加的操作执行到不进位为止,代码如下: 5 * 6 */ 7 LL quickadd(int x, int y) { 8 int xr = x ^ y; //加 9 int nd = x & y; //统计进位 10 while(nd) { 11 int xr1 = xr; 12 int nd1 = nd <<

[算法]位运算实现加减法

异或可以实现不考虑进位的加法,相同为0,不同为1 0101 ^ 0001 = 0100 两个数相加不考虑进位从二进制角度上说就是相同为0,不同为1,因为二进制只有两个数1和0 1+1=0 0+1=1 与运算可以实现进位 同为1才为1 0101 & 0001 = 0001 说明最低位有进位 int add(int a, int b) { return b == 0 ? a : add(a ^ b, (a & b) << 1); } 左移一位表示 将进位加到前一位 递归表示要遍历进

二进制的位运算

二进制的位运算: 1.按位与 & 1)清零.如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零. 2)取数中指定位.取对应x位,该数的对应位为1,其余位为零.可以得到x位的指定位数. 2.按位或  | 1)常用来对一个数的某个位,置1. 3.异或运算 ^ 1)使特定位翻转,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可. 2)与0相异保留原值. 值交换的方法:1.借助第三变量来实现:C=A;A=B;B=C; 2.利用加减法实现两个变量

Java中的二进制及基本的位运算

Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神

通过位运算求两个数的和(求解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.用乘除代替加减,但是一想,

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

转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理. 对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负. 原码 -> 补码: 数值位取反加1 补码 -> 原码: 对该补码的数值位继续 取反加1 补码 的绝对值(称为真值):正数的真值就是本身,负数的真值是各

Java位运算基础知识

在学习Java运算时,补充学习Java位运算. Java位运算 位运算都是针对整数的补码进行位运算. & 按位与运算 先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下几个规律: (1)正数&其他数=正数 考虑最高位为0,按位与都为0 (2)偶数&其他数=偶数 考虑最低位为0,按位与都为0 (3)0&其他数=0 按位与后位数全是0 (4)1&奇数=1,1&偶数=0 通过它可以快速判断一个数是奇数还是偶数 | 按位或运算 先将整数转换为

位运算

位运算的实际应用场景 http://blog.csdn.net/zmazon/article/details/8262185

POJ 1781 In Danger Joseph环 位运算解法

Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 具体具体解析请看大师Knuth的Concrete m