zoukankan      html  css  js  c++  java
  • [LintCode] A + B 问题

    Bit-by-Bit summation:

     1 class Solution {
     2 public:
     3     /*
     4      * @param a: The first integer
     5      * @param b: The second integer
     6      * @return: The sum of a and b
     7      */
     8     int aplusb(int a, int b) {
     9         // write your code here, try to do it without arithmetic operators.
    10         int res = 0, sum = 0, carry = 0;
    11         for (int i = 0; i < 32; i++, a >>= 1, b >>= 1){
    12             int d1 = a & 1, d2 = b & 1;
    13             sum = (d1 ^ d2 ^ carry);
    14             carry = max((d1 & d2), max((d1 & carry), (d2 & carry)));
    15             res ^= (sum << i);
    16         }
    17         return res;
    18     }
    19 };

    Treat a + b as two parts:

    1. a + b without carry;
    2. carry of a + b;
    3. recursively plus part 1 and part 2 until no carry exists.
     1 class Solution {
     2 public:
     3     /*
     4      * @param a: The first integer
     5      * @param b: The second integer
     6      * @return: The sum of a and b
     7      */
     8     int aplusb(int a, int b) {
     9         // write your code here, try to do it without arithmetic operators.
    10         while (b) {
    11             int carry = a & b;  // carry
    12             a ^= b;             // plus without carry
    13             b = carry << 1;     // recursively plus the two parts
    14         }
    15         return a;
    16     }
    17 };

    The code can be further shortened by writing it recursively.

     1 class Solution {
     2 public:
     3     /*
     4      * @param a: The first integer
     5      * @param b: The second integer
     6      * @return: The sum of a and b
     7      */
     8     int aplusb(int a, int b) {
     9         // write your code here, try to do it without arithmetic operators.
    10         if (!b) return a;
    11         return aplusb(a ^ b, (a & b) << 1);
    12     }
    13 };

    Or just in one line :-) 

     1 class Solution {
     2 public:
     3     /*
     4      * @param a: The first integer
     5      * @param b: The second integer
     6      * @return: The sum of a and b
     7      */
     8     int aplusb(int a, int b) {
     9         // write your code here, try to do it without arithmetic operators.
    10         return (!b ? a : aplusb(a ^ b, (a & b) << 1));
    11     }
    12 };
  • 相关阅读:
    【Spring】注解的循环依赖问题
    【网络】计算机网络自顶向下读书笔记
    【JUC】并发编程的艺术笔记
    【JUC】多线程手撕代码面试题
    【操作系统】王道操作系统全盘汇总
    【Spring】IoC源码分析以及实现
    【Spring】用例子来初次理解IoC
    拼音工具类
    chr(10)与chr(13)的区别
    List 集合转String 逗号拼接
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606409.html
Copyright © 2011-2022 走看看