c语言中用位运算实现加法技巧介绍

 更新时间:2012年11月24日 15:10:03   作者:  
用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,需要的朋友可以参考下

用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,在不考虑进位的基础上,如下

复制代码 代码如下:

1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0

很明显这几个表达式可以用位运算的“^”来代替,如下
复制代码 代码如下:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?肯定是不行的,矛盾就在于,如何去
获取进位?要获取进位我们可以如下思考:
复制代码 代码如下:

0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1

//换个角度看就是这样
复制代码 代码如下:

0 & 0 = 不进位
1 & 0 = 不进位
0 & 1 = 不进位
1 & 1 = 进位

正好,在位运算中,我们用“<<”表示向左移动一位,也就是“进位”。那么我们就可以得到如下的表达式
复制代码 代码如下:

//进位可以用如下表示:
(x&y)<<1

到这里,我们基本上拥有了这样两个表达式
复制代码 代码如下:

x^y //执行加法
(x&y)<<1 //进位操作

我们来做个2位数的加法,在不考虑进位的情况下
复制代码 代码如下:

11+01 = 100 // 本来的算法
// 用推算的表达式计算
11 ^ 01 = 10
(11 & 01) << 1 = 10
//到这里 我们用普通的加法去运算这两个数的时候就可以得到 10 + 10 = 100
//但是我们不需要加法,所以要想别的方法,如果让两个数再按刚才的算法计算一次呢
10 ^ 10 = 00
(10 & 10) << 1 = 100

到这里基本上就得出结论了,其实后面的那个 “00” 已经不用再去计算了,因为第一个表达式就已经算出了结果。
继续推理可以得出三位数的加法只需重复的计算三次得到第一个表达式的值就是计算出来的结果。
c代码如下:
复制代码 代码如下:

int Add(int a,int b)
{
int jw=a&b;
int jg=a^b;
while(jw)
{
int t_a=jg;
int t_b=jw<<1;
jw=t_a&t_b;
jg=t_a^t_b;
}
return jg;
}

计算机本质是二进制运算,许多高人和天书都展示了如何用位运算来实现让人纠结却又惊奇的事情。在豆瓣上看到一篇日志描述如何用位运算实现乘法,其实问题解决的关键是如何用位运算实现加法。觉得原文叙述不够精确,现总结如下。
定理1:设a,b为两个二进制数,则a+b = a^b + (a&b)<<1。
证明:a^b是不考虑进位时加法结果。当二进制位同时为1时,才有进位,因此 (a&b)<<1是进位产生的值,称为进位补偿。将两者相加便是完整加法结果。
定理2:使用定理1可以实现只用位运算进行加法运算。
证明:利用定理1中的等式不停对自身进行迭代。每迭代一次,进位补偿右边就多一位0,因此最多需要加数二进制位长度次迭代,进位补偿就变为0,这时运算结束。

相关文章

  • C++实现string存取二进制数据的方法

    C++实现string存取二进制数据的方法

    这篇文章主要介绍了C++实现string存取二进制数据的方法,针对STL中string的用法进行了较为详细的分析,需要的朋友可以参考下
    2014-10-10
  • C语言实现递归版扫雷游戏实例

    C语言实现递归版扫雷游戏实例

    大家好,本篇文章主要讲的是C语言实现递归版扫雷游戏实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • OpenCV实现无缝克隆算法的步骤详解

    OpenCV实现无缝克隆算法的步骤详解

    借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一个看起来无缝且自然的构图。本文将详解OpenCV实现无缝克隆算法的步骤,需要的可以参考一下
    2022-06-06
  • VS2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL(未能完成操作未指定的错误)

    VS2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL(未能完成操作未指定的错误)

    这篇文章主要介绍了VS2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL(未能完成操作。未指定的错误),需要的朋友可以参考下
    2020-07-07
  • C语言 分支语句详解分析

    C语言 分支语句详解分析

    分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句
    2021-10-10
  • C语言实现排序算法之归并排序详解

    C语言实现排序算法之归并排序详解

    这篇文章主要介绍了C语言实现排序算法之归并排序,对归并排序的原理及实现过程做了非常详细的解读,需要的朋友可以参考下
    2014-07-07
  • C++结构体用法实例分析

    C++结构体用法实例分析

    这篇文章主要介绍了C++结构体用法,实例分析了默认构造函数,复制构造函数,运算符重载等使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C++设计模式之策略模式(Strategy)

    C++设计模式之策略模式(Strategy)

    这篇文章主要为大家详细介绍了C++设计模式之策略模式Strategy ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • c++实现哈希桶的步骤

    c++实现哈希桶的步骤

    本文主要介绍了c++实现哈希桶的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C语言 详解字符串基础

    C语言 详解字符串基础

    在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符
    2022-04-04

最新评论