• [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 };
  • 相关阅读:
    安装Visual Studio的插件AnkhSvn
    从零开始安装 Ambari (1) -- 安装前的准备工作
    centos7 安装 mysql
    hortonworks docker 安装
    Kafka connect
    KONG -- 图形化管理(Kong Dashboard)
    KONG -- 配置 service 并添加 key-auth
    KONG 安装 (在 CentOS 7 中)
    kylin cube 构建过程
    sqoop 安装与命令
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4606409.html
Copyright © 2020-2023  润新知