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

2023-10-26

位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。

1.整数加法

int Add(int a,int b)  
{  
    for(int i = 1; i; i <<= 1)       
        if(b & i)          
            for(int j = i; j; j <<= 1)      
                if(a & j) a &= ~j;  
                else {a |= j; break;}                        
    return a ;  
}  
我的思路主要是利用a+1的位运算就是最左端(从第0位开始向左)连续的1变为0,原先a中为0的位置最低那一位变为1。
在不同的位上加1,那就是从相应的位开始向左计算,右边不变。
下面还有一个网上的思路,我觉得这个更好:

int Add(int a,int b)  
{  
	if(b == 0) return a;//没有进位的时候完成运算  
	int sum,carry;  
	sum = a ^ b;//完成第一步没有进位的加法运算  
	carry=(a & b) << 1;//完成第二步进位并且左移运算  
	return Add(sum,carry);//进行递归,相加  
}  
我简化一下:

int Add(int a,int b) { return b ?  Add(a ^ b,(a & b) <<1 ): a; } 
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。

2.整数减法
这个和加法一样了,首先取减数的补码,然后相加。

int Minus(int a,int b)  
{  
    int i;
    for(i = 1; i && ((b & i) ==0 ); i <<= 1)
        ;  
    for(i <<= 1; i; i <<=1 ) 
        b ^= i;  
    return Add(a,b);  
}  

3.整数乘法

乘法就是将乘数写成(2^0)*k0 + (2^1)*k1 + (2 ^2)*k2 + ... + (2^31)*k31,其中ki为0或1,然后利用位运算和加法就可以了。

int Mul(int a,int b)  
{  
    int ans = 0;  
    for(int i = 1; i; i <<= 1, a <<= 1)  
        if(b & i)  
            ans += a;  
		return ans;  
} 

4.整数除法

除法就是由乘法的过程逆推,依次减掉(如果够减的话)divisor << 31、divisor << 30、... 、divisor << 2、divisor << 1、divisor(要保证不能溢出)减掉相应数量的除数就在结果加上相应的数量。

int Div(int dividend, int divisor) 
{
	// assert(divisor != 0)
	int sign = 1;
	if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0)
		sign = -1;
	unsigned int x = (unsigned int)abs(dividend);
	unsigned int y = (unsigned int)abs(divisor);
	int bitCnt = sizeof(int) << 3;
	int quotient = 0;
	int k = bitCnt-1;
	while(((1 << k) & y) == 0) k--;
	for(int j = bitCnt-1-k; j >= 0; j--)
	{
		if(x >= (y << j))
		{
			x -= (y << j);
			quotient += (1 << j);
		}
	}
	return sign*quotient;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用位运算实现两个整数的加减乘除运算 的相关文章

  • 筛选法与试除法 判断素数

    素数的求解方法 第一种 试除法 第二种 筛选法 试除法 顾名思义 求一个数X是不是素数 就试用小于x大于1区间的自然数 只要有一个能整除 那么x就不是素数 否则就是 以输出100 200之间的素数为例 include
  • 散列表习题

    1 考虑key的集合S 0 8 16 24 32 40 48 56 64 用除余法构造的散列函数 h1 key key 12 h2 key key 11 h1将S映射到的值域有几个元素 3 h2将S映射到的值域有几个元素 9 2 散列表的规
  • 【算法】KMP算法实现顺序串各种模式匹配运算的算法设计

    C 版 一 设计任务 编写程序 利用顺序串的基本运算 建立目标串以及模式串 用BF算法求出t在s中的位置 求出模式串的next数组以及nextval数组 KMP算法使用next数组以及改进的KMP算法使用nextval数组求出t在s中的位置
  • 由计数排序衍生出来的桶排序

    计数排序说白了 就是拿一个列表来记录list里的数对应count的下标出现的次数 最后利用count的统计打印出来即可 下面来看看桶排序 针对较多的数据排序 将数据分为n个桶 列表遍历 冒泡排序逆用 确保每个桶里有序 直到最后将内个桶的数据
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • 优质数对的数目[位运算特点+抽象能力考察+分组快速统计]

    位运算特点 抽象能力考察 分组快速统计 前言 一 优质数对的数目 二 思路与优化过程 总结 参考文献 前言 位运算是计算机最基本的计算 是最快的运算方式 与或非各有特点 抽象能力考察我理解成一种 拿核心去累赘 的能力 分组快速统计 我们不必
  • 【经典排序算法】3. 插入排序

    对顺序性强的数据 插入排序就比较快 最好情况O n 代码如下 public class Main public static void main String args int arr 3 3 5 6 2 1 arrPrint arr In
  • “起床困难综合症”「NOI2014」【题解】

    起床困难综合症 洛谷 题目 题目描述 drd的防御战线由n扇防御门组成 每扇防御门包括一个运算op和一个参数t 其中运算一定是OR XOR AND中的一种 参数则一定为非负整数 如果还未通过防御门时攻击力为x 则其通过这扇防御门后攻击力将变
  • 兔子问题---细说斐波那契数列

    对于兔子问题的鼎鼎大名 相信很少有人没听过吧 为了完整性还是再说一下题目吧 题目描述 已知一对兔子每一个月可以生一对小兔子 而一对兔子出生后 第三个月开始生小兔子假如一年内没有发生死亡 则一对兔子开始 第N个月后会有多少对 这道题所描述的就
  • LeetCode-剑指 Offer II 114. 外星文字典,BFS 搜索算法及图的表示

    剑指 Offer II 114 外星文字典 现有一种使用英语字母的外星文语言 这门语言的字母顺序与英语顺序不同 给定一个字符串列表 words 作为这门语言的词典 words 中的字符串已经 按这门新语言的字母顺序进行了排序 请你根据该词典
  • 算法训练day43

    文章目录 1049 最后一块石头的重量 II 求最大重量 思路分析 代码实现 494 目标和 求组合方法数 思路分析 动规方法 代码实现 总结思考 474 一和零 求二维背包的最大物品数 思路分析 代码实现 思考总结 1049 最后一块石头
  • 剖析高性能队列Disruptor背后的数据结构和算法

    本文是学习算法的笔记 数据结构与算法之美 极客时间的课程 Disruptor 是一种内存消息队列 它经Java 中另外一个非常常用的内存消息队列 ArrayBlockQueue ABS 的性能 要高出一个数量级 可以算得上是最快的内存消息队
  • 【Leetcode】225. 用队列实现栈

    题目描述 请你仅使用两个队列实现一个后入先出 LIFO 的栈 并支持普通栈的全部四种操作 push top pop 和 empty 实现 MyStack 类 void push int x 将元素 x 压入栈顶 int pop 移除并返回栈
  • 数据结构系列——链表linklist

    本期主题 数据结构之 链表 往期链接 数据结构系列 先进先出队列queue 数据结构系列 栈 stack 目录 1 链表定义 2 代码实现链表 1 链表定义 定义 链表由多个结点组成 结点不仅包含值 还包含到下一个结点的信息 所以通过这种方
  • 华为OD德科面试+机试记录

    一 机试 6 25 三道编程题 难度偏中 由于时间久远 只记得其中两道题目 1 找车位 动态规划 2 题目不记得了 后面如果找到会补充 双指针 3 高效的任务规划 动态规划 第一题和第二题是做出来了 第三题做出来一点点 当时时间不够 没想出
  • leetcode:1905. 统计子岛屿

    题目来源 leetcode 1905 统计子岛屿 题目描述 class Solution public int countSubIslands vector
  • 设计一个能够获取栈中最小值的栈。

    设计一个栈 要求 支持 push pop top 操作 并能在常数时间内检索到栈中最小元素 示例 public Stack
  • 【数据结构】Binary Search Tree(BST) 二分搜索树

    数据结构源码 实现类 import java util import java util LinkedList import java util Queue import java util Stack 二分搜素树 BST param
  • LeetCode题解—260.只出现一次的数字Ⅲ

    题目地址 260 只出现一次的数字 III 力扣 LeetCode 题解 这道题是基于寻找只出现一次的数字 上的拓展 136 只出现一次的数字 力扣 LeetCode 在 中 我们只需要把所有的数字异或一遍即可 因为只有一个数字是唯一的 但
  • 【LeetCode刷题笔记】位运算

    231 2 的幂 解题思路 1 除法 不断循环判断 如果能被 2 整除 就不断除以 2 直到不能被 2 整除为止 最后结果如果是 1

随机推荐

  • 【数字图像处理笔记(七)】之冲激和取样的傅里叶变换

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 冲激和取样特性 一 连续冲激的定义 线性系统和傅里叶变换研究的核心是冲激及其取样特性 连续变量t在t 0处的单位冲激表示 满足等式 物理上 如果我们把t解释为时间 那么一个冲激可
  • [Context and Structure Mining Network for Video Object Detection]阅读笔记

    文章目录 TOC 文章目录 Abstract Introduction Related work Proposed Method 1 overview 2 Sptial temporal context Information Encodi
  • 数字图像学笔记 —— 17. 图像退化与复原(自适应滤波之「最小二乘方滤波」)

    文章目录 维纳滤波的缺点 约束最小二乘方滤波 给一个实际例子吧 维纳滤波的缺点 维纳滤波 Wiener Filter 虽然是一种非常强大的退化图像还原算法 但是从实验过程我们也发现它存在着致命的缺陷 那就是要求输入退化系统的 F u v
  • WCF学习笔记(基于REST规则方式)

    一 WCF的定义 WCF是 NET 3 0后开始引入的新技术 意为基于windows平台的通讯服务 首先在学习WCF之前 我们也知道他其实是加强版的一个面向服务 SOA 的框架技术 如果熟悉WebService就会知道WebService是
  • char* 和jstring转换

    在平时的工作 经常用到jni和const类型转换 调用例子 JNIEXPORT jstring JNICALL Java com powervision videolib jni JniNatives native 1getPpsLengt
  • 数字信号处理——DFT的一些理解

    DFT 离散傅里叶变换 的基本概念 1 对信号作DFT的过程 1 对模拟信号以一定的采样率进行采样 得到离散信号 2 将离散信号转换为离散 无穷 序列 即用序列号n代替原时间变量 3 对离散 无穷 序列进行截断 只取一部分构成离散序列 有限
  • 拆分单链表

    Copyright c 2016 烟台大学计算机与控制工程学院 All rights reserved 文件名 text html 作者 常轩 微信公众号 Worldhello 完成日期 2016年11月16日 版本号 V1 0 程序输入
  • vue项目接入unity3D模块并进行数据通信

    一 添加unity工程 unity工程师会提供一个前端可使用的包 将其放在vue项目的public下 我这里以unity文件夹命名 二 在项目中创建iframe标签并引入index html文件 三 修改public gt unity gt
  • YOLO V1 学习摘要

    YOLO V1是一种基于深度学习的目标检测算法 其原理和流程如下 1 利用卷积神经网络 CNN 提取输入图像的特征 2 将图像分割成S x S个网格 grid 每个网格负责检测其中一个特定尺寸和位置的目标 3 对于每个网格 预测一个包含5
  • Pycharm无法导入anaconda的包

    Pycharm无法导入anaconda的包 第一 检查是否设置了anaconda的环境变量 第二步 查看anaconda下面的envs是否为空包 如果是空包 便要创建虚拟环境详细过程可参照 2023最新 Python Pycharm Ana
  • 堆—特殊二叉树

    我们了解了树形结构之后 知道了二叉树 但是二叉树的具体用途我们还是不知道 今天就来看看一种特殊的二叉树 堆 它是一种完全二叉树 著名的topK问题就是用堆来求取的 可以求出一组数中的最大或者最小的元素 所使用的堆就是大根堆 小根堆 所谓大根
  • VMware安装Android-x86_64-9.0-r2系统兼容arm设置

    Android x86 64 9 0 r2虚拟机安装兼容arm的android应用程序 1 安装后WLAN提示已连接无网络 实际网络联通 终端模拟器依次输入以下命令后回车重启系统 su settings put global captive
  • Xray-基础详细使用

    一 Xray介绍 Xray 是一款功能强大的安全评估工具 由多名经验丰富的一线安全从业者呕心打造而成 可支持与AWVS BP等众多安全工具联合使用 二 Xray简易架构 说明 了解 Xray 的整体架构可以更好的理解客户端和配置文件的设置
  • for循环详解

    For循环详解 举例如图下 首先for循环相比其他循环可以把条件写在一起如图所示 这变量 条件 变化必不可少其他循环也是 但是for循环有一个点它在初始变量的时候 进入循环之前就已经执行了一次 条件是每次进入循环之前都会执行并且判断 还有当
  • 【git】git rebase -i 合并多次提交

    1 概述 git rebase i 命令用于交互式地重新应用提交历史 其中 i 选项表示以交互方式进行操作 通过使用这个命令 您可以合并 删除 编辑 重排等操作提交历史 从而修改提交的顺序或合并多次提交 下面是使用 git rebase i
  • Linux简介

    1 1操作系统是什么 操作系统概述 要讲明白 Linux 是什么 首先得说说什么是操作系统 计算机系统是指按用户的要求 接收和存储信息 自动进行数据处理并输出结果信息的系统 它由硬件子系统 计算机系统赖以工作的实体 包括显示屏 键盘 鼠标
  • Xcode9 xcodebuild 命令行打包遇到的坑与解决方案

    主要涉及的打包脚本命令 if xcodeversion lt 830 then Xcode 8 3 以下打包时使用该脚本 xcodebuild exportArchive exportFormat ipa archivePath schem
  • 十一、文件的读写

    一 文件的读写模式 1 文件常用的打开模式 r 只能读 r 可读可写 不会创建不存在的文件 如果直接写文件 则从顶部开始写 覆盖之前此位置的内容 如果先读后写 则会在文件最后追加内容 w 可读可写如果文件存在则覆盖整个文件 不存在则创建 w
  • 数学建模 —— 降维算法

    文章目录 前言 数据降维的作用 一 主成分分析 PCA 1 介绍 2 算法流程 3 主成分分析的说明 二 因子分析 FA 1 介绍 2 算法流程 3 因子分析和主成分分析的对比 三 典型相关性分析 CCA 1 介绍 2 算法思路 3 算法流
  • 用位运算实现两个整数的加减乘除运算

    位运算的思想可以应用到很多地方 这里简单的总结一下用位运算来实现整数的四则运算 1 整数加法 int Add int a int b for int i 1 i i lt lt 1 if b i for int j i j j lt lt