zoukankan      html  css  js  c++  java
  • 不用算术运算符实现两个数的加法(按位异或)

      对于二进制的加法运算,若不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0,通过对比异或,不难发现,此方法与异或运算类似。因而排出进位,加法可用异或来实现。然后考虑进位,0+0进位为0,1+0进位为1,0+1进位为0,1+1进位为1,该操作与位运算的&操作相似。

      那么加法运算可以这样实现:

      1)先不考虑进位,按位计算各位累加(用异或实现),得到值a;

      2)然后在考虑进位,并将进位的值左移,得值b,若b为0,则a就是加法运算的结果,若b不为0,则a+b即得结果(递归调用该函数)。

      算法代码如下(非vs平台):

    1 int bitAdd(int a,int b)
    2 {
    3     if(b==0)
    4         return a;
    5     int sum = a^b;
    6     int carry =(a&b)<<1;
    7     return bitAdd(sum,carry);
    8 }

    技巧题:实现1+2+3+4+……+n的值。

    假设n=100;在vs平台下的代码为:

     1 #include <stdio.h>
     2 #include<stdlib.h>
     3 int bitAdd(int a,int b)
     4 {
     5     int sum=0,carry=0;
     6     if(b==0)
     7         return a;
     8     sum = a^b;
     9     carry =(a&b)<<1;
    10     return bitAdd(sum,carry);
    11 }
    12 
    13 int main()
    14 {
    15     int i,sum=0 ,n = 100;
    16     for (i = 1;i<=n ;i++ )
    17     {
    18         sum = bitAdd(sum,i);
    19     }
    20     printf("1+2+3+…+%d = %d
    ",n,sum);
    21     system("pause");
    22     return 0;
    23 }

    运行结果为:

    程序运行正确。

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/houjun/p/4908725.html
Copyright © 2011-2022 走看看