位运算实现加减乘除运算

位运算如何实现加减乘除 关注二进制的加法,我们容易发现这样的一个规律:(1)位运算异或与求和运算结果一致异或逻辑运算:1^1=0,1^0=1,0^1=1,0^0=0求和算术运算:1+1=0,1+0=1,0+1=1,0+0=0(2)位运算与逻辑运算与求“进位”的结果一致。与逻辑运算:1&1=1,1&0=0,0&1=0,0&0=0求进位运算:1+1=1,1+0=0,0+1=0,0+0=01.位... 阅读详情

我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最底层都只是对0101的存储和运算。因此,了解位运算有助于提升我们对计算机底层操作原理的理解。

今天就来看看怎么不使用显式“ + - * /”运算符来实现加减乘除运算。

下面我们一个一个来看。

1. 加法运算

先来个我们最熟悉的十进制的加法运算:

13 + 9 = 22

我们像这样来拆分这个运算过程:

不考虑进位,分别对各位数进行相加,结果为sum:
个位数3加上9为2;十位数1加上0为1; 最终结果为12;

只考虑进位,结果为carry:
3 + 9 有进位,进位的值为10;

如果步骤2所得进位结果carry不为0,对步骤1所得sum,步骤2所得carry重复步骤1、 2、3;如果carry为0则结束,最终结果为步骤1所得sum:
这里即是对sum = 12 和carry = 10重复以上三个步骤,(a) 不考虑进位,分别对各位数进行相加:sum = 22; (b) 只考虑进位: 上一步没有进位,所以carry = 0; (c) 步骤2carry = 0,结束,结果为sum = 22.
我们发现这三板斧行得通!

那我们现在还使用上面的三板斧把十进制运算放在二进制中看看是不是也行的通。

13的二进制为0000 1101,9的二进制为0000 1001:

不考虑进位,分别对各位数进行相加:
sum = 0000 1101 + 0000 1001 = 0000 0100

考虑进位:
有两处进位,第0位和第3位,只考虑进位的结果为:
carry = 0001 0010

步骤2carry == 0 ?,不为0,重复步骤1 、2 、3;为0则结束,结果为sum:
本例中,
(a)不考虑进位sum = 0001 0110;
(b)只考虑进位carry = 0;
(c)carry == 0,结束,结果为sum = 0001 0110
转换成十进制刚好是22.

我们发现,适用于十进制的三板斧同样适用于二进制!仔细观察者三板斧,大家能不能发现其实第一步不考虑进位的加法其实就是异或运算;而第二部只考虑进位就是与运算并左移一位–;第三步就是重复前面两步操作直到第二步进位结果为0。

这里关于第三步多说一点。为什么要循环步骤1、 2、 3直到步骤2所得进位carry等于0?其实这是因为有的数做加法时会出现连续进位的情况,举例:3 + 9,我们来走一遍上述逻辑:

    a = 0011, b = 1001;
    start;

    first loop;
    1.1 sum = 1010
    1.2 carry = 0010
    1.3 carry != 0 , go on;

    second loop;
    2.1 sum = 1000;
    2.2 carry = 0100;
    2.3 carry != 0, go on;

    third loop;
    3.1 sum = 1100;
    3.2 carry = 0000;
    3.3 carry == 0, stop; result = sum;

end

如上面的例子,有的加法操作是有连续进位的情况的,所以这里要在第三步检测carry是不是为0,如果为0则表示没有进位了,第一步的sum即为最终的结果。

有了上面的分析,我们不难写出如下代码:

// 递归写法
int add(int num1, int num2){
    if(num2 == 0)
        return num1;
    int sum = num1 ^ num2;
    int carry = (num1 & num2) << 1;
    return add(sum, carry);
}

// 迭代写法
int add(int num1, int num2){
    int sum = num1 ^ num2;
    int carry = (num1 & num2) << 1;  
    while(carry != 0){
        int a = sum;
        int b = carry;
        sum = a ^ b;
        carry = (a & b) << 1;  
    }
    return sum;
}

我们的计算机其实就是通过上述的位运算实现加法运算的(通过加法器,加法器就是使用上述的方法实现加法的),而程序语言中的+ - * /运算符只不过是呈现给程序员的操作工具,计算机底层实际操作的永远是形如0101的位,所以说位运算真的很重要!

2. 减法运算

我们知道了位运算实现加法运算,那减法运算就相对简单一些了。我们实现了加法运算,自然的,我们会想到把减法运算11 - 6变形为加法运算11 + (-6),即一个正数加上一个负数。是的,很聪明,其实我们的计算机也是这样操作的,那有的人会说为什么计算机不也像加法器一样实现一个减法器呢?对的,这样想当然是合理的,但是考虑到减法比加法来的复杂,实现起来比较困难。为什么呢?我们知道加法运算其实只有两个操作,加、 进位,而减法呢,减法会有借位操作,如果当前位不够减那就从高位借位来做减法,这里就会问题了,借位怎么表示呢?加法运算中,进位通过与运算并左移一位实现,而借位就真的不好表示了。所以我们自然的想到将减法运算转变成加法运算。

怎么实现呢?

刚刚我们说了减法运算可转变成一个正数加上一个负数,那首先就要来看看负数在计算机中是怎么表示的。

+8在计算机中表示为二进制的1000,那-8怎么表示呢?

很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。这只是直观的表示方法,其实计算机是通过2的补码来表示负数的,那什么是2的补码(同补码,英文是2’s complement,其实应该翻译为2的补码)呢?它是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式,求取步骤:

  • 第一步,每一个二进制位都取相反值,0变成1,1变成0(即反码)。

  • 第二步,将上一步得到的值(反码)加1。

简单来说就是取反加一!

关于补码更详细的内容可参维基百科-补码,这里不再赘述。

其实我们利用的恰巧是补码的可以将数字的正负号变号的功能,这样我们就可以把减法运算转变成加法运算了,因为负数可以通过其对应正数求补码得到。计算机也是通过增加一个补码器配合加法器来做减法运算的,而不是再重新设计一个减法器。

以上,我们很容易写出了位运算做减法运算的代码:

/*
* num1: 减数
* num2: 被减数
*/
int substract(int num1, int num2){
    int subtractor = add(~num2, 1);// 先求减数的补码(取反加一)
    int result = add(num1, subtractor); // add()即上述加法运算  
    return result ;
}

3. 乘法运算

我们知道了加法运算的位运算实现,那很容易想到乘法运算可以转换成加法运算,被乘数加上乘数倍的自己不就行了么。这里还有一个问题,就是乘数和被乘数的正负号问题,我们这样处理,先处理乘数和被乘数的绝对值的乘积,然后根据它们的符号确定最终结果的符号即可。步骤如下:

(1) 计算绝对值得乘积
(2) 确定乘积符号(同号为证,异号为负)

有了这个思路,代码就不难写了:

/*
* a: 被乘数
* b: 乘数
*/
int multiply(int a, int b){ 
    // 取绝对值      
    int multiplicand = a < 0 ? add(~a, 1) : a;    
    int multiplier = b < 0 ? add(~b , 1) : b;// 如果为负则取反加一得其补码,即正数      
    // 计算绝对值的乘积      
    int product = 0;    
    int count = 0;    
    while(count < multiplier) {        
        product = add(product, multiplicand);        
        count = add(count, 1);// 这里可别用count++,都说了这里是位运算实现加法      
    }    
    // 确定乘积的符号      
    if((a ^ b) < 0) {// 只考虑最高位,如果a,b异号,则异或后最高位为1;如果同号,则异或后最高位为0;            
        product = add(~product, 1);    
    }    
    return product;
}

上面的思路在步骤上没有问题,但是第一步对绝对值作乘积运算我们是通过不断累加的方式来求乘积的,这在乘数比较小的情况下还是可以接受的,但在乘数比较大的时候,累加的次数也会增多,这样的效率不是最高的。我们可以思考,如何优化求绝对值的乘积这一步。

考虑我们现实生活中手动求乘积的过程,这种方式同样适用于二进制,下面我以13*14为例,向大家演示如何用手动计算的方式求乘数和被乘数绝对值的乘积。

这里写图片描述
从上图的计算过程可以看出,如果乘数当前位为1,则取被乘数左移一位的结果加到最终结果中;如果当前位为0,则取0加到乘积中(加0也就是什么也不做);

整理成算法步骤:

(1) 判断乘数是否为0,为0跳转至步骤(4)
(2) 将乘数与1作与运算,确定末尾位为1还是为0,如果为1,则相加数为当前被乘数;如果为0,则相加数为0;将相加数加到最终结果中;
(3) 被乘数左移一位,乘数右移一位;回到步骤(1)
(4) 确定符号位,输出结果;

代码如下:

int multiply(int a, int b) {  
    //将乘数和被乘数都取绝对值 
    int multiplicand = a < 0 ? add(~a, 1) : a;   
    int multiplier = b < 0 ? add(~b , 1) : b;  
     
    //计算绝对值的乘积  
    int product = 0;  
    while(multiplier > 0) {    
        if((multiplier & 0x1) > 0) {// 每次考察乘数的最后一位    
            product = add(product, multiplicand);    
        }     
        multiplicand = multiplicand << 1;// 每运算一次,被乘数要左移一位    
        multiplier = multiplier >> 1;// 每运算一次,乘数要右移一位(可对照上图理解)  
    }   
    //计算乘积的符号  
    if((a ^ b) < 0) {    
        product = add(~product, 1);  
    }   
    return product;
}

显而易见,第二种求乘积的方式明显要优于第一种。

4. 除法运算

除法运算很容易想到可以转换成减法运算,即不停的用除数去减被除数,直到被除数小于除数时,此时所减的次数就是我们需要的商,而此时的被除数就是余数。这里需要注意的是符号的确定,商的符号和乘法运算中乘积的符号确定一样,即取决于除数和被除数,同号为证,异号为负;余数的符号和被除数一样。
代码如下:

/*
* a : 被除数
* b : 除数
*/
int divide(int a, int b){    
    // 先取被除数和除数的绝对值    
    int dividend = a > 0 ? a : add(~a, 1);    
    int divisor = b > 0 ? a : add(~b, 1);    

    int quotient = 0;// 商    
    int remainder = 0;// 余数    
    // 不断用除数去减被除数,直到被除数小于被除数(即除不尽了)    
    while(dividend >= divisor){// 直到商小于被除数        
        quotient = add(quotient, 1);        
        dividend = substract(dividend, divisor);    
    }    
    // 确定商的符号    
    if((a ^ b) < 0){// 如果除数和被除数异号,则商为负数  
        quotient = add(~quotient, 1);    
    }    
    // 确定余数符号    
    remainder = b > 0 ? dividend : add(~dividend, 1);    
    return quotient;// 返回商
}

这里有和简单版乘法运算一样的问题,如果被除数非常大,除数非常小,那就要进行很多次减法运算,有没有更简便的方法呢?

上面的代码之所以比较慢是因为步长太小,每次只能用1倍的除数去减被除数,所以速度比较慢。那能不能增大步长呢?如果能,应该怎么增大步长呢?

计算机是一个二元的世界,所有的int型数据都可以用[2^0, 2^1,…,2^31]这样一组基来表示(int型最高31位)。不难想到用除数的2^31,2^30,…,2^2,2^1,2^0倍尝试去减被除数,如果减得动,则把相应的倍数加到商中;如果减不动,则依次尝试更小的倍数。这样就可以快速逼近最终的结果。

2的i次方其实就相当于左移i位,为什么从31位开始呢?因为int型数据最大值就是2^31啊。

代码如下:

int divide_v2(int a,int b) {   
    // 先取被除数和除数的绝对值    
    int dividend = a > 0 ? a : add(~a, 1);    
    int divisor = b > 0 ? a : add(~b, 1);    
    int quotient = 0;// 商    
    int remainder = 0;// 余数    
    for(int i = 31; i >= 0; i--) {
        //比较dividend是否大于divisor的(1<<i)次方,不要将dividend与(divisor<<i)比较,而是用(dividend>>i)与divisor比较,
        //效果一样,但是可以避免因(divisor<<i)操作可能导致的溢出,如果溢出则会可能dividend本身小于divisor,但是溢出导致dividend大于divisor       
        if((dividend >> i) >= divisor) {            
            quotient = add(quotient, 1 << i);            
            dividend = substract(dividend, divisor << i);        
        }    
    }    
    // 确定商的符号    
    if((a ^ b) < 0){
        // 如果除数和被除数异号,则商为负数        
        quotient = add(~quotient, 1);    
    }    
    // 确定余数符号    
    remainder = b > 0 ? dividend : add(~dividend, 1);    
    return quotient;// 返回商
}

好了,以上。

位运算算法篇:位运算实现加减乘除 一文帮组你掌握位运算实现加减乘除运算! 阅读详情

相关推荐

位运算实现加减乘除运算——超详细C语言描述

** 位运算实现整数加减乘除运算——C语言描述 ** 本文将从位运算的种类、原理、运用入手,详细介绍如何仅使用位运算实现整数的加减乘除运算,代码采用C语言实现。** ** 1.位运算 ** 我们知道,程序中的所有数据在计算机内存中都是以二进制的形式存放的,所谓的位运算就是直接对整数在内存中的二进制位进行操作。位运算是早期计算机的基础,正因如此,在计算机组成原理课程中我们经常会注意到位运算的存在。时...

qq_41716838的博客 8923

只使用位运算实现加减乘除

LeetCode 29. 两数相除, 原题目的要求是不能使用乘法, 除法和取余运算符实现除法; 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了.

trong_ 的烂笔头 2665

用位运算实现整数的加减乘除运算

基本的C++位运算符有:&(与)、|(或)、~(取反)、^(异或)、>>(右移)、众所周知,采用位运算可以极大的提高代码的运行效率。如果有的程序需要处理海量数据,其中又涉及大量简单的加减乘除运算,则可以用位运算来进行操作,减少程序的执行时间。   例如,a int a=5,b; b=a<<3; cout输出结果为:b=40 即b=a     这里有个问题,那就是如果乘数不是2的n次方的形

u011433274的专栏 2189

位运算实现乘法运算

在回答本问题之前,先学习一些有关位运算的知识。 (1) 常用的等式: -n=~(n-1)=~n+1 (2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。 (3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。 注:对

辉 1万+

每天一道LeetCode----位运算实现加减乘除四则运算

Divide Two Integers原题链接Divide Two Integers 意思是重新实现除法运算,这里不要复习一下用位运算实现加减乘除四则运算 C++学习笔记—–用位运算实现加减乘除以前也有记录过,这里主要是复习,另外,除法需要优化,在这里实现加法通过异或运算和与运算实现 两个二进制数相加,异或运算的结果是不考虑进位时的结果 两个二进制数相加,与运算的结果是对应为是否有进位0

一个程序渣渣的小后院 3667

搞定汽车座椅电机EMC超标:一个PCB滤波板的实战设计与避坑心得

本文详细介绍了汽车座椅电机EMC超标问题的解决方案,通过PCB滤波板的实战设计,解决了传导发射测试超标问题。文章分享了在空间受限条件下的滤波电路架构设计、接地系统优化及迭代验证过程,为汽车直流电机的EMC整改提供了实用方法论。

weixin_30336061的博客 380

class 033 位运算实现加减乘除

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐.

2301_80967814的博客 945

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

计算机基础之位运算、以及位运算实现加减乘除

众所周知,由于电路的复杂性因素,电脑中都使用二进制数,只有0和1两个数码,逢二进一,最容易用电路来表达,比如0代表电路不通,1代表电路通畅。那么,什么是二进制呢? 比如说我们所熟悉的十进制,通俗的说是由0,1,2,3,4,5,6,7,8,9这十个数字组成,如果比9再大一个数,就会进一位,高位加一,低位重置,也就是10。 再比如八进制,是由0,1,2,3,4,5,6,7这八个数组成,逢八进一,比...

鱼阿鱼的博客 1911

从INCA到Excel:手把手教你移植汽车标定数据的查表插值算法(附源码)

本文详细介绍了如何将汽车标定数据从INCA平台移植到Excel,实现查表插值算法的完整迁移。通过解析INCA MAP数据结构,设计Excel环境下的双线性插值算法,并提供VBA和C#两种实现方案,帮助工程师高效处理标定数据。文章包含实用代码示例和性能优化技巧,适用于ECU开发与标定场景。

weixin_29313239的博客 410

别再死记硬背了!用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率

本文深度解析如何使用MaxDEA软件实操SBM、DDF、NDDF模型,手把手教你测算绿色全要素生产率(GTFP)。通过详细的模型选择对比、数据准备策略和MaxDEA操作流程,帮助研究者科学构建指标体系并准确解读结果,提升环境管理研究的实证分析能力。

weixin_28731231的博客 314

用位运算实现加减乘除法

除法的位运算实现,本质上就是**“按位填充商”**的过程:我们从最高位问到最低位:“嘿,商的这一位填 1 也就是减去y×2iy×2i,原来的数够不够减?够减 -> 填 1,更新被除数。不够 -> 填 0。这其实就是把十进制的长除法变成了二进制版本,效率非常高,稳定在 32 次循环内完成。

jyyyyx的算法之旅 875

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1460

只用位运算不用算术运算实现整数的加减乘除运算

只用位运算不用算术运算实现整数的加减乘除运算 给定两个32位整数a和b,可正,可负,可0,不能使用算术运算符,分别实现a和b的加减乘除运算 不考虑溢出 用位运算实现加法 如果不考虑进位,a^b就是正确结果。 在只算进位的情况下,也就是只考虑a加b的过程中进位产生的值是什么,结果就是(a&b)<<1,因为在第i位只有1与1相加才会产生进位。 把完全不考虑进位的相加值与...

磐石长的博客~ 576

详细解释xilinx源语的使用:IDELAYE2和IDELAYE3

/ 完整的数据位对齐模块input wire dqs, // 数据选通input wire [7:0] dq_in, // 8位数据输入output wire [63:0] data_out // 并行数据输出// 延迟控制信号// 每个数据位都需要独立的IDELAYgenvar i;i < 8;// IDELAYE2实例.IDELAY_VALUE (10), // 初始值。

baidu_34971492的博客 436

基于深度学习的商品标签识别系统:UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集

基于YOLO系列模型的商品标签识别系统能够有效解决商品信息提取的自动化问题。通过合理的数据集准备、模型训练和UI设计,我们可以实现一个功能强大的商品标签识别系统。希望本文提供的内容能够为大家提供有价值的帮助。

YOLO 474

java位运算实现加减乘除

位运算实现加减乘除

如果不能对抗遗忘 那么就记录 1418

YOLOv8优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4874

java位运算实现_利用位运算实现加减乘除

利用位运算实现加减乘除基础知识数据在计算机内存中是以二进制存储的。几种常用的位运算:····与运算 &: 对应位均为1时为1,其它为0。····或运算 |:对应位均为0时为0,其它为1。····异或运算 ^:对应位不相同时为1,相同时为0.····按位取反 ~:每一位取反····右移 >>:将二进制进行右移,低位丢掉,高位补零。····左移 <加法int add(int ...

weixin_28861381的博客 343

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

位运算---只使用位运算实现整数的加减乘除

【题目】  给定两个32位整数a和b,可正、可负、可0.不能使用算术运算符,分别实现a和b的加减乘除。【要求】  如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不必对那些结果负责。【基本思路】 加法运算  使用位运算实现加法运算主要分为两个部分。先计算完全不考虑进位进行相加的结果,再计算只考虑进位的产生值。将两个结果相加就是最终的结果。  例如:   a:    0

冰殇的博客 2239

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java 实现位运算计算加减乘除

机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。举个例子,比如在机器字长为8位的情况下(机器字长是指计算机直接处理的二进制数据的位数,它决定了计算机的运算精度,一般是8的整数倍,8位、16位、32位、64位、128位),十进制中的+3,转换成二进制就是0000 0011,如果是-3,转换成二进制就是1000 0011。转换的二进制数0000 0011和1000 0011就是机器数。 这里我们还需要知道的就是机

zhuzhoulin的博客 1566

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

位运算来实现整数的加减乘除四则运算-java

详细讲解使用java位运算实现加减乘除

Fponyo的博客 937

Java如何只使用位运算实现加减乘除

前言 接前面一篇博客,这又是某个公司的奇葩面试题(都说了到底是哪家公司才会出这种没营养的面试题)。不过吐槽归吐槽,这个题目还是有点学问的,比前面那个 不使用比较运算符如何比较两个数的大小 强多了(但是还是能看出面试官是在存心刁难人)。 原题是“只给加法,如何实现减乘除”,我寻思着,既然减乘除都不给了,那就加大点难度,加法也别给了吧,今天就手动去实现加减乘除。这里只实现int类型的加减乘除。 一说到这种“不给xxx如何实现xxx的问题”,那第一个想到的就是位运算,因此本篇博客的各种运算也是基于位运算的。关于位

qq_41530937的博客 383

java用位运算实现加减乘除

我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.

buhuisuanfa的博客 6340

用位运算不用算术运算实现整数的加减乘除运算

只用位运算不用算术运算实现整数的加减乘除运算 位运算实现整型算术运算:加法,减法,乘法和除法 真实算术运算结果,无溢出 python实现

the_harder_to_love的博客 1046

算法讲解033【必备】位运算实现加减乘除

运算关键位操作等价逻辑加法a ^ b无进位和 + 进位减法加补码(负数)乘法循环左移并累加分解为 2 的幂次和除法右移比较并减去逆向乘法(试减)这些函数展示了如何用位运算模拟算术运算,适合面试或底层编程学习,但实际开发中应直接使用运算符。

chbmvdd的博客 486
上一篇: CSS中的定位布局
下一篇: ES6书写规范
MosumLucifer
博客等级 码龄12年 19粉丝 50原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值