使用 & ^ << 等 位符实现加法运算

学习过C语言的同学都知道,再写代码的时候,位操作运算总比算数运算操作快,

本文就是用C语言提供的位运算实现两个数的加法。

本文使用的代码都经过调试正常并且能够运行,调试环境centos     gcc  一下是实现代码,以及测试结果:

#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv)
{
  int add_a,add_b;
  int sum;
  if(3!=argc)
  printf("usage : bin_add , (#add_1)  (#add_d)\n");
  else
  {
   add_a= atoi(argv[1]);
   add_b= atoi(argv[2]);
   sum =add(add_a,add_b);
   printf("(%d)+(%d)=%d\n",add_a,add_b,sum);
   }
  return 0;
} 

int add(int temp_a,int temp_b)
{
    int temp_c=0;
    int temp_d=0;
     temp_c=temp_a & temp_b; //求进位
     temp_d=temp_a ^ temp_b; //求本位和
    while(temp_c)
     {
     temp_c<<=1;
     temp_b=temp_c;
     temp_a=temp_d;
     temp_c=temp_a & temp_b;
     temp_d=temp_a ^ temp_b;
     }
     return temp_d;
}

代码测试:

[[email protected] Destop]$ gcc -o bin_add test.c
[[email protected] Destop]$ ./bin_add  10 789
(10)+(789)=799
[[email protected] Destop]$ ./bin_add  1234  4567
(1234)+(4567)=5801
[[email protected] Destop]$ ./bin_add  1234  -456
(1234)+(-456)=778
[[email protected] Destop]$ ./bin_add  -34  -456
(-34)+(-456)=-490

其实主要就是解决加法过程中分开 “本位和”  和 “进位和” ;一次一次把进位加到自己的位置上就可以了。

使用 & ^ << 等 位符实现加法运算,布布扣,bubuko.com

时间: 2024-07-30 10:19:52

使用 & ^ << 等 位符实现加法运算的相关文章

[leetcode] 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. 分析: 这里要求我们不能用加法.减法等运算符来实现加法运算.这里应该使用位运算来实现加法运算,实际上,这也是计算机CPU内部实现加法运算的方案. x XOR y真值表: x y output 0 0 0 0 1 1

[PAT] 一元多项式的乘法与加法运算 C语言实现

[PAT] 02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出

(笔试题)只用逻辑运算实现加法运算

题目: 如题所示 思路: 逻辑运算,即二进制运算,无外乎与&.或|.非~.异或^以及移位>>,<<等操作: 而加法运算,在十进制中,只有按位相加以及进位两个操作. 从二进制角度也一样,就是bit位相加,加上相应的进位. 1.bit位相加,通过逻辑运算的异或操作可以实现,如0+1=1,1+0=1,0+0=0: 2.进位运算,通过逻辑运算的与操作可以实现,如1+1=1,因为进位是往高位+1,因此需要将进位结果左移一位. 将上述两个操作再做加法运算,就是加法运算的结果,这是一个递

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; } 答案是:>6 第二题 #include<stdio.h> int m

实现2个超大数的加法运算

一道笔试题~实现2个超大数据的加法运算,这2个超大数,意思就是long也装不下的数,就顶大概100位吧. 这道题其实看上去很简单,但是实际上涉及到的知识点还是很多的,非常考验一个人的程序设计能力和对API的熟悉程度. 思路很简单,这么大的数,long都存不下,那只能存在String中了,然后将每个数字取出,放到数组,由最末位开始计算,算加法,判断是否进位,进位则前位+1,若超过长度,则copy到新的数组. 下面上代码: public class BigInt { private int[] di

整数运算:CPU内部只有加法运算

学汇编的一边儿去.我这里讲的是CPU进行计算的原理.首先我这里用MC的红石电路模拟了一个加法器:http://www.0xaa55.com/thread-313-1-1.htm首先加法器是怎么实现的呢?是用了非门电路.首先来看看二进制的加法:0+0=00+1=11+0=11+1=10首先来看规律.只看最低位,如果左边的“被加数”和“加数”都一样的话,结果的最低位是0,否则是1.而如果“被加数”和“加数”都是1,那么就会有进位.总结出来的规律是:运算结果最低位=被加数 逻辑非 加数运算结果的进位=

浮点转定点算法-加法运算

这里默认用的是32位的float存储,其具体规则可以看个连接http://bbs.chinaunix.net/thread-3746530-1-1.html 将浮点数用32位的定点形式表示. 将两个数通过移位扩大至相同的倍数. 定点加法运算. 将上一步的运算结果还原为浮点表示. #define MIN(X,Y) (X>=Y?Y:X) /** 浮点的加法运算转换为定点的加法运算 * author : zgr 2014-04-03 * 1. 内存中符号位+阶码+尾数的浮点表示法转换为符号位+整数部分

洛谷 P1952 火星上的加法运算_NOI导刊2009提高(3)

P1952 火星上的加法运算_NOI导刊2009提高(3) 题目描述 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限.她想向你求助,作为一位优秀的程序员,你当然不会拒绝. 输入输出格式 输入格式: 第一行先愉入一个运算的进制N(2<=N<=36),接下来两行为需要进行运算的字符,其中每个字符串的长度不超过200位,其为N进制的数.其中包括0-9及a-z(代表10-35). 输出格式: 在N进制下它们的和 输入输出样例 输入样例#1: 复制 20 1234567

图解算法:单向链表做加法运算

问:给出两个非空的链表,来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且每个结点只能存储一位数字.将这两个链表相加起来,返回一个新的链表,表示他们之和. 例如:342 + 465 = 807 两数相加这道题,处理的就是最简单的数学加法运算,只是它是建立在链表的基础之上,所以难度在于对链表的处理. 加法运算,除了每一位的加法之外,还需要考虑进位的情况.针对这道题来说,链表的每一个结点存储一位数字,并且是基于自然数字逆序存储,也就是链头到链尾保持低到高位的顺序,这样就等于,进位