news 2026/8/25 18:15:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
位运算--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);}}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 18:13:46

机械臂速成小指南(十八):圆弧规划

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源或者有问题的同学可在我的CSDN主页中寻找哦&#x1f916;&#x1f63d;&#x1f984; 指南目录&#x1f4d6;&#xff1a; &#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff…

作者头像 李华
网站建设 2026/8/25 18:08:19

UVM objection机制深度解析:不是计数器,而是phase流程门控

1. 这两个函数不是“加减计数器”&#xff0c;而是UVM验证流程的交通信号灯 刚接触UVM objection机制时&#xff0c;我跟绝大多数人一样&#xff0c;把 raise_objection 和 drop_objection 当成一对简单的“1/-1”计数器——只要调用次数匹配&#xff0c;仿真就不会结束。结…

作者头像 李华
网站建设 2026/8/25 17:57:07

Vue 3与TypeScript工程化面试要点与实战技巧

1. Vue 3与TypeScript工程化面试核心要点解析作为前端技术栈的黄金组合&#xff0c;Vue 3 TypeScript的工程化实践已成为大厂面试的高频考点。去年在重构公司级组件库时&#xff0c;我深刻体会到类型系统与工程规范对项目可维护性的提升。本文将拆解20真实面试中出现率最高的工…

作者头像 李华
网站建设 2026/8/25 17:54:35

JRTPLIB安全通信实战:SRTP加密传输与DTLS-SRTP密钥协商完整指南

JRTPLIB安全通信实战&#xff1a;SRTP加密传输与DTLS-SRTP密钥协商完整指南 【免费下载链接】JRTPLIB RTP Library 项目地址: https://gitcode.com/gh_mirrors/jr/JRTPLIB 在实时音视频通信中&#xff0c;明文 RTP 数据流随时可能被窃听、篡改或注入。本指南带你基于 JR…

作者头像 李华
网站建设 2026/8/25 17:52:06

前端面试核心知识点与性能优化实战指南

1. 前端面试基础知识整理的必要性前端开发岗位的面试往往包含大量基础知识的考察&#xff0c;这些看似简单的概念题恰恰是区分候选人专业素养的关键。我在过去三年参与过近百场前端技术面试&#xff0c;发现约70%的候选人会在基础题上失分&#xff0c;尤其是工作3年以上的开发者…

作者头像 李华
网站建设 2026/8/25 17:48:38

一键生成4K大图:SenseNova-U1.5-8B-MoT高分辨率AI绘图实战手册

一键生成4K大图&#xff1a;SenseNova-U1.5-8B-MoT高分辨率AI绘图实战手册 【免费下载链接】SenseNova-U1.5-8B-MoT 项目地址: https://ai.gitcode.com/SenseNova/SenseNova-U1.5-8B-MoT SenseNova-U1.5-8B-MoT 是商汤推出的原生统一多模态 AI 绘图模型&#xff0c;原生…

作者头像 李华