zoukankan      html  css  js  c++  java
  • 剑指offer--12.不用加减乘除做加法

     位运算,好久没用了

    &:都为1,结果为1

    ^:相同为0,不同为1

    |:有1,结果为1

    <<:左移

    ------------------------------------------------------------------------------

    时间限制:1秒 空间限制:32768K 热度指数:97386

    题目描述

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
    思路:
    1.用位运算计算各个位上相加的结果
    2.考虑各个位上进位的情况
    3.将1结果与2结果相加
    eg:
    111+899
    首先‭01101111‬+‭001110000011‬得‭001111101100‬:1004

    1004

    进行&运算得到‭0011‬,左移进位:110
    6

    110异或001111101100‬得到‭001111101010‬:1002
    1002

    进行&运算得到‭100,左移进位得:1000
    8

    异或得到:‭001111100010‬
    994

    进行&运算得到‭100,左移进位得:10000
    16

    异或得到:‭‭001111110010‬
    1010

    进行&运算得到‭100,左移进位得:0

    计算完毕!

    过程类似:111+899,1+9进1,1+9进1,进到1+8+1再进1,得到1010.当没有进位时,计算完毕。

    class Solution {
    public:
        int Add(int num1, int num2)
        {
            while(num2 != 0) {
                int tmp = num1 ^ num2;
                num2 =  (num1&num2) << 1;
                num1 = tmp;
            }
            return num1;
        }
    };
  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/langyao/p/10565500.html
Copyright © 2011-2022 走看看