计算机 加减乘除原理 二进制运算 PHP 位运算

20 篇文章 0 订阅
12 篇文章 0 订阅
/**
 * 位运算 加法实现 核心:逢二进一
 * @param int $a 被加数
 * @param int $b 加数
 * @return int   和
 */
function add(int $a, int $b): int
{
    // 0001 0011
    $and = $a & $b; // 0001 按位与 两个都为1
    $xor = $a ^ $b; // 0010 按位异或 一个为0,一个为1
    
    if (!$and) {
        return $a | $b; // 按位或 任何一个为1
    }
    
    if (!$xor) {
        return $and << 1; // 左移
    }
    
    return add($and << 1, $xor);
}

/**
 * 位运算 减法实现 核心:加法逆运算
 * @param int $a 被减数
 * @param int $b 减数
 * @return int   差
 */
function subtract(int $a, int $b): int
{
    return add($a, -$b); // 加法逆运算
}

/**
 * 位运算 乘法实现 核心:2*3 => 2*[0011 3的二进制数] =>从右向左计算 2*[2^0]+2*[2^1] => 2+4 => 6
 * @param int $a 被乘数
 * @param int $b 乘数
 * @return int   积
 */
function multiply(int $a, int $b): int
{
    $sum = 0; // 乘积
    $j   = 0; // 移位
    
    $b2  = decbin($b);  // 二进制数
    $len = strlen($b2); // 二进制数长度
    
    for ($i = $len - 1; $i > -1; --$i, ++$j) {
        if ($b2[$i])
            $sum = add($sum, $a << $j); // 二进制加法
    }
    
    return $sum;
}

/**
 * divide 位运算 除法实现 核心:减法运算,直到减到快要小于零,减法次数即为商,剩余数字即为余数
 * @param int $a 被除数
 * @param int $b 除数
 * @return int   商
 */
function divide(int $a, int $b): int
{
    $num = 0;  // 商
    $c   = $a; // 余数
    
    while ($c >= $b) {
        $c = subtract($c, $b); // 二进制减法
        ++$num;
    }
    
    return $num;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值