当前位置: 首页 > news >正文

位运算--01---两数相除

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 两数相除
    • 题目:
    • 分析:
    • 辅助代码:
        • 加 键 乘
  • 除法逻辑分析
    • isNeg(int n) 判断一个数是否小于0
    • 正常相除逻辑 c= a/b
        • a= 2的K次方 * b + 2的(K-n)次方*b +.....
        • 最后c = b * ( 2^k + 2^(k-n)+....)
      • return isNeg(a) ^ isNeg(b) ? negNum(res) : res;
        • ==a != b 可以转换为 a ^ b==
    • 怎么解决系统最小值转绝对值
        • 最小负数 相反数 也是最小负数
      • 分析
    • a是系统最小值, b不是,分2种情况
      • 第一种: 如果a是系统最小值,且b等于-1
        • 计算机底层规定: 系统最小值比系统最大值多1
        • 比如int范围是: -128到127
      • ==所以leetcode规定: 系统最小值/-1 =系统最大值==
      • 第二种: 如果a是系统最小值,且b不等于-1
        • 那么令a+1去除以b,后面再去补偿
  • 两数相除----总的代码

两数相除

https://leetcode.com/problems/divide-two-integers

题目:

分析:

除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商。

辅助代码:

加 键 乘
publicstaticintadd(inta,intb){intsum=a;while(b!=0){sum=a^b;b=(a&b)<<1;a=sum;}returnsum;}publicstaticintnegNum(intn){returnadd(~n,1);}publicstaticintminus(inta,intb){returnadd(a,negNum(b));}publicstaticintmulti(inta,intb){intres=0;while(b!=0){if((b&1)!=0){res=add(res,a);}a<<=1;b>>>=1;}returnres;}

除法逻辑分析

isNeg(int n) 判断一个数是否小于0

publicstaticbooleanisNeg(intn){returnn<0;}

正常相除逻辑 c= a/b

a= 2的K次方 * b + 2的(K-n)次方*b +…
最后c = b * ( 2^k + 2^(k-n)+…)
publicstaticintdiv(inta,intb){intx=isNeg(a)?negNum(a):a;inty=isNeg(b)?negNum(b):b;intres=0;for(inti=30;i>=0;i=minus(i,1)){if((x>>i)>=y){res|=(1<<i);x=minus(x,y<<i);}}returnisNeg(a)^isNeg(b)?negNum(res):res;}
  1. isNeg(int n) 先全部转成正数来计算
  2. int是32位,0-31,其中第31位表示符号位,一位一位的去做判断
  3. (x >> i) >= y , x右移去找能大于等于y的,(等同于y左移小于等于x,不过左移,因为符号位的关系,有安全隐患) --------判断K的值是否存在
  4. 找到符合条件的位数,记录下来 用res= res | (1 << i);2的k次方存在,对应位数记录为1
  5. 然后x减去 y << i
  6. 循环

return isNeg(a) ^ isNeg(b) ? negNum(res) : res;

a != b 可以转换为 a ^ b

怎么解决系统最小值转绝对值

最小负数 相反数 也是最小负数


分析

publicstaticintdivide(inta,intb){if(a==Integer.MIN_VALUE&&b==Integer.MIN_VALUE){return1;}elseif(b==Integer.MIN_VALUE){return0;}elseif(a==Integer.MIN_VALUE){if(b==negNum(1)){returnInteger.MAX_VALUE;}else{intc=div(add(a,1),b);returnadd(c,div(minus(a,multi(c,b)),b));}}else{returndiv(a,b);}}

  1. a 和 b都是系统最小值,则返回1
  2. a不是系统最小, b是系统最小值, ,则返回0
  3. a是系统最小值, b不是
  4. a也不是 ,b也不是----可以直接用上述div(int a, int b)方法

a是系统最小值, b不是,分2种情况

if(b==negNum(1)){returnInteger.MAX_VALUE;}else{intc=div(add(a,1),b);returnadd(c,div(minus(a,multi(c,b)),b));}

第一种: 如果a是系统最小值,且b等于-1

计算机底层规定: 系统最小值比系统最大值多1
比如int范围是: -128到127
  1. 按道理等于系统最大值+1,
  2. 因为计算机底层不存在,系统最大值+1
  3. 所以按leetcode规定,返回系统最大值

所以leetcode规定: 系统最小值/-1 =系统最大值

第二种: 如果a是系统最小值,且b不等于-1

那么令a+1去除以b,后面再去补偿

两数相除----总的代码

publicclassCode03_BitAddMinusMultiDiv{publicstaticintadd(inta,intb){intsum=a;while(b!=0){sum=a^b;b=(a&b)<<1;a=sum;}returnsum;}publicstaticintnegNum(intn){returnadd(~n,1);}publicstaticintminus(inta,intb){returnadd(a,negNum(b));}publicstaticintmulti(inta,intb){intres=0;while(b!=0){if((b&1)!=0){res=add(res,a);}a<<=1;b>>>=1;}returnres;}publicstaticbooleanisNeg(intn){returnn<0;}publicstaticintdiv(inta,intb){intx=isNeg(a)?negNum(a):a;inty=isNeg(b)?negNum(b):b;intres=0;for(inti=30;i>=0;i=minus(i,1)){if((x>>i)>=y){res|=(1<<i);x=minus(x,y<<i);}}returnisNeg(a)^isNeg(b)?negNum(res):res;}publicstaticintdivide(inta,intb){if(a==Integer.MIN_VALUE&&b==Integer.MIN_VALUE){return1;}elseif(b==Integer.MIN_VALUE){return0;}elseif(a==Integer.MIN_VALUE){if(b==negNum(1)){returnInteger.MAX_VALUE;}else{intc=div(add(a,1),b);returnadd(c,div(minus(a,multi(c,b)),b));}}else{returndiv(a,b);}}}

http://www.cnnetsun.cn/news/4214077.html

相关文章:

  • 机械臂速成小指南(十八):圆弧规划
  • UVM objection机制深度解析:不是计数器,而是phase流程门控
  • Vue 3与TypeScript工程化面试要点与实战技巧
  • JRTPLIB安全通信实战:SRTP加密传输与DTLS-SRTP密钥协商完整指南
  • 前端面试核心知识点与性能优化实战指南
  • 一键生成4K大图:SenseNova-U1.5-8B-MoT高分辨率AI绘图实战手册
  • 开源VST宿主实战:Slopsmith-Desktop的吉他信号链怎么搭
  • dragUI架构全景图:Vuex状态管理与本地存储如何记住你的每一次设计
  • AppErrorsTracking 数据持久化剖析:JSON 存储机制与旧版数据自动迁移原理
  • Java全栈工程师面试核心考察与准备指南
  • LoadRunner性能测试实战:从脚本开发到瓶颈分析全流程详解
  • 操作系统面试核心考点与实战解析
  • 免安装直接体验:sudo-touchid一条curl命令快速启用TouchID的sudo
  • 从NeRF到Relightable3DGaussian:实时点云重光照的5大技术突破与实现路线对比
  • swagger-blocks源码剖析:InternalHelpers如何智能合并多类节点,$ref重写背后的双版本玄机
  • 基于Docker的AI简历生成器JadeAI开发实践
  • 揭秘Nino的Source Generator:编译时代码生成管线深度解析
  • 云帆培训考试系统新手指南:从本地运行到组织第一场考试,一篇就够了
  • 从固定程序到持续进化:WSaiOS-ICAI个体能力进化系统的设计与实现
  • Win11 任务栏一键换回 Win10 样式:ExplorerPatcher 快速上手与避坑指南
  • 性能测试面试12大核心考点与实战解析
  • Next.js 的客户端页面路由详解
  • Redis五大核心数据结构详解:从缓存到数据结构服务器的进阶指南
  • 从通用模型到专业定制:AI应用从“龙虾”到“爱马仕”的范式演进
  • 从 JEPA 演进到 WAM:LeWorldModel 与 Fast-WAM 的一条连续技术脉络
  • 企业级AI Agent标准测评:从可靠性到场景适配的硬核评估指南
  • CLI命令行界面:从基础原理到高效开发与运维实践
  • 解决Redis局域网内不能访问的问题(Windows/Linux/虚拟机)
  • Win10/Win11系统Pads安装与卡死问题终极解决指南
  • LLM-Agent如何重塑信息不对称市场:博弈、挑战与多智能体模拟