• php实现不用加减乘除号做加法(1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍)


    php实现不用加减乘除号做加法(1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍

    一、总结

    1、善于寻找资源:去搜为什么位运算可以实现加法,里面讲的肯定要详细一万倍

    二、php实现不用加减乘除号做加法

    题目描述:

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

    三、代码

    代码一:java代码

    思路:位运算

    1. 两个数异或:相当于每一位相加,而不考虑进位;
    2. 两个数相与,并左移一位:相当于求得进位;
    3. 将上述两步的结果相加
     1 public class Solution {
     2     public int Add(int num1,int num2) {
     3         while (num2!=0) {
     4             int temp = num1^num2;
     5             num2 = (num1&num2)<<1;
     6             num1 = temp;
     7         }
     8         return num1;
     9     }
    10 }
    首先看十进制是如何做的: 5+7=12,三步走
    第一步:相加各位的值,不算进位,得到2。
    第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。
    
    第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。
    
    同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。
    
    第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。
    
    第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
         继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。
    13+11 = ?;
    13 的二进制      1 1 0 1                     -----a        13
    11 的二进制      1 0 1 1                     -----b        11  
    
     (a&b) <<1  ->   1 0 0 1 0                         -----d         18
           a^b  ->     0 1 1 0                   -----e          6
    
     (d&e) <<1  ->   0 0 1 0 0                       ------f         4
            d^e  ->  1 0 1 0 0                  -----g        20
    
     (f&g) <<1  ->   0 1 0 0 0                       ------h        8
            f^g  ->  1 0 0 0 0                   ------i           16
    
     (h&i) <<1  ->   0 0 0 0 0                       ------h        0       ---- --------退出循环
            h^i  ->  1 1 0 0 0                  ------i           24

    四、拓展:php位运算符

    位运算符
    例子名称结果
    $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
    $a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
    $a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
    ~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
    $a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
    $a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。
  • 相关阅读:
    Python 基于Python实现的ssh兼sftp客户端(上)
    lintcode: 最长连续序列
    lintcode:颜色分类
    lintcode: 堆化
    lintcode: 旋转图像
    lintcode: 寻找旋转排序数组中的最小值
    lintcode: 跳跃游戏 II
    lintcode:最小差
    华为:数独填充
    华为:字符集合
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9070162.html
Copyright © 2020-2023  润新知