利用位运算实现加减乘除

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

利用位运算实现加减乘除

受《剑指offer》上题目的启发,现在把利用位运算做加、减、乘、除的方法总结一下。
参考网址:https://blog.youkuaiyun.com/sinat_35261315/article/details/72904945

基础知识

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

加法

参考《剑指offer》题目链接:https://blog.youkuaiyun.com/Allenlzcoder/article/details/79705597
代码如下:

int add(int num1, int num2) {
    int res = 0, carry = 0;
    res = num1^num2;
    carry = (num1&num2) << 1;
    while (carry) {
        int tmp = res;
        res = res^carry;
        carry = (tmp&carry) << 1;
    }
    return res;
}

减法

减法和加法相同,减去一个数相当于加上这个数的相反数,所以完全可以利用加法操作,唯一需要做的就是求出被减数的相反数。
求相反数的方法:每一位取反,末位加一。
代码如下:

//求n的相反数
//~:按位取反
//add:加法操作,末位加一
int negtive(int n) {
    return add(~n, 1);
}

int subtraction(int a, int b) {
    //加上被减数的相反数
    return add(a, negtive(b));
}

乘法

平时在笔算乘法数据都是十进制的,而抛去思维定势,把数看成是二进制,也可以进行笔算乘法,像这样,A表示0.1101;B表示0.1011.
这里写图片描述
根据算式可以知道,对于A*B,步骤细分如下:
1) 将A左移1位(<< 1或者 *2);
2) 将1)的结果乘上B的对应位数字(0 或1);
3) 把2)的结果和之前的结果相加。
也就意味着当B的对应位为1时,对A左移一位然后同上一次的结果做加法。
如果b的对应位为0,只对A左移一位。
当然,上述这些运算不包括符号位,所以两个操作数都需要先转换成正数,符号需要单独考虑。对于4个字节(32位整数)来说,获取符号位只需要取出第31位的值即可。
代码如下:

//取出符号位
int getSign(int n) {
    return n >> 31;
} 

//求n的绝对值
int positive(int n) {
    return (getSign(n) & 1) ? negtive(n) : n;
}

int multiply(int a, int b) {
    //如果两个数符号位不相容,则结果为负
    bool isNegtive = false;
    if(getSign(a) ^ getSign(b))
        isNegtive = true;
    a = positive(a);
    b = positive(b);
    int res = 0;
    while (b | 0) {
        //当b的对应位是1时,才需要加a
        if(b & 1)
            res = add(res, a);
        a = a << 1; //a左移
        b = b >> 1; //b右移
    }
    return isNegtive == true ? negtive(res) : res;
}

除法

同乘法一样,除法也可以进行二进制笔算,以a/b为例,只有当a >= b时才可以上商,又因为是二进制,所以商每次只会多1,在每次上1之后a都要减去一次b。代码如下:

int divide(int a, int b) {
    //被除数不能为0
    if (b == 0)
        throw std::runtime_error("Divided can't be zero...");

    bool isNegtive = false;
    if (getSign(a) ^ getSign(b))
        isNegtive = true;

    a = positive(a);
    b = positive(b);

    int res = 0;
    while (a >= b) {
        res = add(res, 1);
        a = subtraction(a, b);
    }
    return beNegtive == true ? negtive(res) : res;
}
位运算如何实现加减乘除 关注二进制的加法,我们容易发现这样的一个规律:(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&amp;1=1,1&amp;0=0,0&amp;1=0,0&amp;0=0求进位运算:1+1=1,1+0=0,0+1=0,0+0=01.位... 阅读详情

相关推荐

基于PCIE8311+FPGA+TMS320F28335 PCIE应用项目开发板PROTEL99设计硬件(原理图+PCB)文件

基于PCIE8311+FPGA+TMS320F28335 PCIE X1应用项目开发板PROTEL99设计硬件(原理图+PCB)文件,Protel 99se 设计的项目工程文件,包括原理图及PCB印制板图,可用Protel或 Altium Designer(AD)软件打开或修改,都已经制板在实际项目中使用,可作为你产品设计的参考。

GJZGRB的博客 576

位运算实现加减乘除运算

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

Mosum的博客 2万+

数据结构实验1 集合的交、并、差

姓名:Far_Rainbow 学号: 202505000X 专业: 软件工程 年级:2020级 实验名称:实验1 集合的交、并、差 实验内容: (1)实验目的 通过该实验,让学生复习巩固C语言中的循环结构、循环控制条件、分支结构和数组/链表、函数的调用等有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。 (2)实验内容 通过键盘,分别输入两个数据元素类型为正整数的集合A和B,以负数输入为结束条件,输出两个集合的交、并、差。 (3)实验要求 从程序完善性上考虑,集合元

Far_Rainbow的博客 2176

(转)使用位运算技巧实现加减乘除

原题目是:要求不使用乘法、除法和 mod 运算符实现除法。我们把题目要求提高一点,不用加减乘除和 mod 运算符号,只使用位运算实现加减乘除法。【1】实现加法异或(^)运算就是两个数对应二进制值的无进位相加,比如a = 13且b = 20,a ^ b的结果如下(用二进制表示)结果就是:25思路可以转换一下,把加法用异或替换,得到两个数二进制无进位信息相加的结果。然后把这个结果加上进位信息,就是两个数相加的最终结果。

PacosonSWJTU的博客 1299

DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目

简单介绍DASH的起源与发展、MPD文件简要解析、相关项目,以及常见流媒体协议的比较

farewellyi的博客 6880

手眼标定搞定了,手眼矩阵不知道怎么用?快戳!!

手眼标定得到手眼矩阵到底该咋用? 大家好,我是小鱼。上几期给大家分享了关于手眼标定的方法,如果还有不清楚如何让进行手眼标定的同学可以参考下面的文章: 机器人手眼标定都能搞不定?快戳,最好用的手眼标定库!!! 很多同学做完了手眼标定之后得到了手眼矩阵,但是不知道怎么用于程序当中去,还有很多同学搞不清楚各个坐标系之间的关系,今天小智就给大家讲讲手眼矩阵的使用问题。 一、手眼矩阵为什么会长的不一样? 做完手眼标定,得到的手眼矩阵,有可能会长的不一样,这是因为旋转变换是有很多种表示方法的。 1.旋转的表

生活不止眼前的苟且 5342

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

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

trong_ 的烂笔头 2665

用位运算实现加减乘除法

除法:除法是乘法的反向推导,比较绕,比如15/5=3,意思就是5*2+5*1=15,其中2就是2的一次方,1就是2的0次方,也就是说一个数a除以b,那么a一定可以表示为:b*2的0次方+b*2的1次方+....,我们说乘法实际上是加法实现的,那么除法其实就是减法的实现过程,比如15/5,也就是从15中不断地减去5,直到不够减或者为0为止,也就是:15-5*2-5*1=0,其中2就是2的一次方,1就是2的0次方,那么15/5实际上就是2的0次方加上2的一次方。减法:有两种方式,一种是跟加法一样,通过借位。

qq_17805707的博客 713

NLM去噪算法:原理、优化与医学图像处理实战

本文深入解析NLM去噪算法的核心原理及其在医学图像处理中的优化应用。通过全局自相似性计算,NLM算法有效抑制噪声并保留细节,特别适用于超声图像斑点噪声处理。文章还介绍了积分图像和傅里叶变换等优化技巧,显著提升计算效率,并分享医学影像项目中的实用调参经验。

weixin_29051149的博客 346

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析7 8

本关任务:编写一个能查询预定的程序。输入餐馆名称,查询用户账号为当前登录用户且餐馆名称为当前输入餐馆名称的结点信息,并输出其预定时间。本关任务:编写一个能查看预定的程序。创建链队列,从文件order.txt中读取数据,依次进入链队列中。遍历链队列,筛选出用户账号为当前登录用户的结点信息,并依次输出相应的餐馆名称和预定时间。烤肉刘老北京炙子烤肉(四道口店) 11月20日晚餐 0。外婆家(清河华润五彩城店) 12月12日午餐 0。甜鸭梨烤鸭店(农大店) 12月5日晚餐 0。鼎坤朋湘菜馆 12月8日晚餐 0。

m0_62222486的博客 1339

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

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

weixin_28861381的博客 343

Qt —— 调用海康C++版SDK获取摄像头每帧图像,通过OpenCv处理每帧图像后显示在Qt窗口(附:源码)

  关注 笔者 - jxd 微信公众号搜索 “码农总动员” 或 微信扫描下方二维码,了解更多你不知道的XX,O(∩_∩)O

5447

利用位运算来实现加减乘除

一、加法 例子: 8+11=19 ,其二进制的加法形式为 由a^b可以得出相加后没有进位的和 由a&b可以得出相加后产生进位的地方 由(a&b)<<1可以产生进位后的值 那么a^b(没有进位的值)+(a&b)<<1(进位的值)==a+b ,不断的重复啥时候不进位了啥时候终止 分步进行: 那么根据 a^b ,其异或的二进制形式为...

qq_38345598的博客 457

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

加减乘除求余 利用 位运算实现(详细)

这几天培训,偶然看到这样一道题目: 用位运算实现除法和求余运算?这一下子把不了解二进制的小白搞蒙了。 因此,查阅许多资料,写出用位运算实现的加减乘除以及求余的代码,附详细思路,权当笔记,也分享给大家。 首先,我们得了解位运算符: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,.

qq2210912855的博客 6610

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Leetcode29】利用位运算对加减乘除的实现【Python】

Part1. 利用位运算实现乘法 思路:利用乘数的各位是否为1,将所有为1的位,让被乘数左移动相应的位数,然后相加 Ps:这里其实还有一种累加的思路,即通过将被乘数累加乘数次 # 5 * 3 = 15 # 5可以表示为 101 # 3可以表示为 011 # Step1. 判断乘数为1的数位为第0位,和第1位 # Step2. 将被乘数左移动0位,得到101 # Step3. 将被乘数左移动1位,...

广埠屯小拉登的博客 1048

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

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

加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

这也是阿辉开的新专栏,知识将会很零散不成体系,不过绝对干货满满,今天这一篇利用位运算实现加减乘除费了阿辉九牛二虎之力,干的很自备饮水😆不多bb,进入今天的学习吧!!!以下int均为有符号int,所求的加减乘除也是int类型的整型数严谨 😏。

m0_75108739的博客 2834

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

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

冰殇的博客 2239

Java使用位运算实现加减乘除及取余运算

package problems; import java.util.ArrayList; /** * 使用位运算实现 加减乘除 取模 * 原理:加法原则:对应位置进行加和,若果有进位,则加到到高位中。 * 那么使用位运算代替加法,要解决两个问题: * 1、如何计算进位 * 二进制中出现进位的形式只有1+1,可以使用&运算来表示出哪一位需要进位。a&b的二进制结果对应哪一位相加值后需要进位。 * .

biglxl的博客 2777

【算法100天 | 2】位运算实现加减乘除(含:LeetCode 29题 两数相除)

1、打印整数的二进制数据 2、位运算求相反数 3、位运算实现加法 4、位运算实现减法 5、位运算实现乘法 6、位运算实现除法

健身变秃,coding变强 1109

位运算实现加减乘除、求补、比较、正负判断

位运算实现加减乘除、求补、比较、正负判断   2011-11-24 13:52:43|  分类: 数据结构|举报|字号 订阅 位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。 1.整数的加法 view plain int MyAdd(int a,int b)     {         f

autowanglei的专栏 2578

class 033 位运算实现加减乘除

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

2301_80967814的博客 945
上一篇: C++中STL容器利用迭代器删除元素小结
下一篇: 前缀树(字典树,单词查找树,Trie树)
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值