首页 > 其他分享 >位运算实现加减乘除

位运算实现加减乘除

时间:2024-09-21 17:45:15浏览次数:3  
标签:return 运算 实现 res offset int add neg 加减乘除

29. 两数相除

#include <iostream>

using namespace std;

class Solution {
public:

    int add(int a, int b) {
        int res = a;
        while (b != 0) {
            // 无进位相加的结果
            res = a ^ b;
            // 相加时每一位的进位信息
            b = (a & b) << 1;
            // 无进位相加的结果
            a = res;
            // 如果进位信息 b 不全是 0 的话,仍需将进位信息 b 与无进位相加的结果 a 继续相加
        }
        return res;
    }

    // 补码:原码按位取反再加一
    int neg(int n) {
        return add(~n, 1);
    }

    int minus(int a, int b) {
        return add(a, neg(b));
    }

    int multiply(int a, int b) {
        int res = 0;
        while (b != 0) {
            if ((b & 1) != 0)
                res = add(res, a);
            // 算数左移
            a <<= 1;
            // 逻辑右移
            b = (unsigned int) b >> 1;
        }
        return res;
    }

    // 必须保证 a 和 b 都不是整数最小值,返回 a 除以 b 的结果
    int div(int a, int b) {
        int x = a < 0 ? neg(a) : a;
        int y = b < 0 ? neg(b) : b;
        int res = 0;
        for (int i = 30; i >= 0; i = minus(i, 1)) {
            if ((x >> i) >= y) {
                res |= (1 << i);
                x = minus(x, y << i);
            }
        }
        return a < 0 ^ b < 0 ? neg(res) : res;
    }

    const int MIN = INT_MIN;
    const int MAX = INT_MAX;

    int divide(int a, int b) {
        // a 和 b 都是整数最小
        if (a == MIN && b == MIN) return 1;
        // a 和 b 都不是整数最小,正常除
        if (a != MIN && b != MIN) return div(a, b);
        // a 不是整数最小,b 是整数最小
        if (b == MIN) return 0;
        // a 是整数最小,b 是 -1,返回整数最大,因为题目里明确这么说了
        if (b == neg(1)) return MAX;
        // a 是整数最小,b 不是整数最小,b 也不是 -1
        a = add(a, b > 0 ? b : neg(b));
        int res = div(a, b);
        int offset = b > 0 ? neg(1) : 1;
        return add(res, offset);
    }
};

标签:return,运算,实现,res,offset,int,add,neg,加减乘除
From: https://www.cnblogs.com/sprinining/p/18424320

相关文章

  • priority_queue的模拟实现
    priority_queue的模拟实现1.priority_queue的介绍和使用1.1priority_queue的介绍1.2priority_queue的使用2.priority_queue的模拟实现3.堆排序1.priority_queue的介绍和使用1.1priority_queue的介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个......
  • HashMap源码分析:如何实现一次put方法
    前情提示:&为按位与运算,将两个数转为二进制,当他们对应位置都为1的时候,得到的结果为,其他情况下结果为0例如:0000000000001011--->110000000000001001--->90000000000001001--->9即11&9=9 本篇主要介绍hashMap的构造方法、put方法相关内容相关成员变量介绍......
  • uniapp - 实现安卓App打包上架应用商店详细教程,详解Hbuilder打包编译apk发布上传到应
    前言【苹果App】打包上架Appstore应用商店,请访问。在uni-app安卓App项目开发中,详解打包app及上架应用市场教程,uniapp打包app安卓应用并发布到软件商店,提供多种方式打包编译为APK文件(HbuilderX云打包/本地原生打包/离线打包),附带申请Android签名证书多种方法、对要上......
  • 医院预约|基于springBoot的医院预约挂号系统设计与实现(附项目源码+论文+数据库)
    私信或留言即免费送开题报告和任务书(可指定任意题目)目录一、摘要二、相关技术三、系统设计四、数据库设计   五、核心代码  六、论文参考 七、源码获取 一、摘要近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据......
  • 智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)
    私信或留言即免费送开题报告和任务书(可指定任意题目)目录一、摘要二、相关技术三、系统设计四、数据库设计  五、核心代码  六、论文参考 七、源码获取  一、摘要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都......
  • Andorid+Java使用Apache POI库实现doc、docx、xls、xlsx的读取和写入
    1、前言 最近要用AndroidStudio和Java实现多种文件的导入和读取,包括常见的文本文件txt、doc、docx、xls和xlsx。其中txt用输入输出流操作即可。经过搜索查找,确定了使用ApachePOI库进行其余文件类型的读写。在此记录从开始在apache官网上下载导入包后尝试读取doc便报错,到打......
  • 从数据中台到数据飞轮:打破孤岛,实现数据的连续演进
    在数字化的浪潮中,企业对数据的依赖日益增加,数据中台已经成为众多企业构建数据能力的基石。然而,光有一个功能全面的数据中台并不足以使企业的数据价值最大化,这一点在业界已经逐渐形成共识。进一步地,数据飞轮的概念应运而生,被视作是超越数据中台,实现数据动能循环和业务增长的关键阶段......
  • 基于python+flask框架的基于微信小程序的购物系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和智能手机的普及,移动电子商务已成为人们日常生活中不可或缺的一部分。微信小程序,凭借其无需下载、即用即走的特......
  • 数据中台与数据飞轮:实现数据驱动的必经之路
    在数据驱动的业务发展领域内,数据中台已经成为众多企业构建其数据架构的基石。数据中台提供了集中管理和数据统一的基础设施,帮助企业整合零散的数据资源,从而实现数据的存储、管理和初步分析。然而,一个典型的问题是,许多企业在建立了数据中台之后,并没有充分发挥数据的潜力,数据的存储和......
  • 基于python+flask框架的基于微信小程序的二手电商平台设计与实现(开题+程序+论文) 计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和智能手机的普及,人们的消费习惯逐渐从线下转向线上,特别是在电子商务领域,各种交易平台层出不穷。其中,二手电商作......