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

初级--05--- 取模运算转化为位运算、位运算进行加减乘除

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

文章目录

  • 取模运算 转化为 位运算
    • 公式:
        • ==a%b = a&(b-1) ,且b=1<<k(k为整数)==
      • 案例:
        • num % 64 等于 num & 63
    • 原理:
    • 注意:
        • 取模的数b, 要满足b为2的整数次幂(即b=1<<k,k为整数),公式转化才成立
  • 位运算进行加减乘除
        • 初级--01---二进制、位运算
        • num >> 6 相当于 num/64
    • 1. 加法:add
        • 无进位信息和+进位信息和 = 加法的和
      • ==a^b + (a&b)<<1==
    • 2. 减法: minus
        • 可以将减法转换成加法计算。a - b = a + (-b)
      • 相反数
      • 正数相反数 = 其反码+1
      • 减法代码
    • 3. 乘法: multi
    • 4. 除法: divide
        • 位运算--01---两数相除

取模运算 转化为 位运算

公式:

若满足b为2的整数次幂(即b=1<<k,k为整数)时,可用一个特殊的小技巧将取模运算转化为位运算,

a%b = a&(b-1) ,且b=1<<k(k为整数)

案例:

num % 64 等于 num & 63

原理:

注意:

取模的数b, 要满足b为2的整数次幂(即b=1<<k,k为整数),公式转化才成立

位运算进行加减乘除

初级–01—二进制、位运算

num >> 6 相当于 num/64

1. 加法:add

  1. 由a^b可得按位相加后没有进位的和;
  2. 由a&b可得可以产生进位的地方;
  3. 由(a&b)<<1得到进位后的值。
  4. 那么 按位相加后原位和+进位和 就是加法的和了,而 a^b + (a&b)<<1 相当于把 +
    两边再代入上述三步进行加法计算。直到进位和为0说明没有进位了则此时原位和即所求和。
无进位信息和+进位信息和 = 加法的和

a^b + (a&b)<<1

publicstaticintadd(inta,intb){intsum=a;while(b!=0){sum=a^b;//无进位信息和b=(a&b)<<1;//进位信息和a=sum;//无进位相加信息}returnsum;}

2. 减法: minus

可以将减法转换成加法计算。a - b = a + (-b)

相反数

正数相反数 = 其反码+1

publicstaticintnegNum(intn){returnadd(~n,1);}

减法代码

publicstaticintnegNum(intn){returnadd(~n,1);}publicstaticintminus(inta,intb){returnadd(a,negNum(b));}

3. 乘法: multi

publicstaticintmulti(inta,intb){intres=0;while(b!=0){if((b&1)!=0){res=add(res,a);}a<<=1;b>>>=1;}returnres;}

4. 除法: divide

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

位运算–01—两数相除
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/4208217.html

相关文章:

  • MyBatis关联查询深度解析:嵌套结果与嵌套查询的性能权衡
  • 主流登录鉴权框架深度解析:Spring Security、Shiro、JWT与OAuth2选型指南
  • 本地IDE与笔试平台环境差异解析与解决方案
  • 从Ubuntu迁移回Windows:21步实战指南与数据安全备份
  • 2026年高性价比UPS选购指南:150-550元区间16款横评与实战配置
  • STM32程序跑飞调试:在线调试、看门狗与崩溃日志的三层防御体系
  • ECharts数据地图实战:从零实现中国省份数据可视化
  • Java高级工程师面试:分布式系统与内容社区架构实战
  • 信息流混排系统:平衡用户体验与广告收入的动态博弈架构
  • 支付宝电脑网站支付接口对接实战:从沙箱到上线的完整指南
  • 敏捷开发、V模型与瀑布模型:实战选型指南与避坑要点
  • 校招笔试通关秘籍:九大必刷题库核心解析与高效备战策略
  • AI代理金融交易实战:从架构设计到安全防御的完整指南
  • AI重点已死,人工智能崛起
  • Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
  • 企业私域知识智能化:基于Agent与Knowledge Hub的架构设计与实践
  • 高效构建个人面试知识库:面经记录与优化指南
  • 美妆专柜同源OEM还是智商税?看懂乳化粒径和备案全链条再下单
  • LeetCode周赛无伤AK攻略:从算法原理到实战技巧
  • UE5中实现电影级老旧视觉风格:从材质到后期处理全流程
  • 人机料法环是什么?制造业质量管理的5大核心要素解析
  • 生产车间如何进行质量管理和生产过程控制
  • 大模型稳定输出JSON的工程实践:从提示词到函数调用
  • UE5.7实战:从零构建可扩展战斗系统(连击/命中/伤害反馈)
  • 内容安全审核系统选型实战:腾讯云IMS如何平衡效果与成本
  • Windows平台IndexTTS 2.5与vLLM加速:一键部署高性能本地语音合成方案
  • 暨南大学计算机考研机试备考指南与高频考点解析
  • 大厂Java面试技术栈与AI融合趋势解析
  • Unity 2D飞行棋游戏开发实战:从零构建完整回合制游戏
  • 用AICodeSwitch本地代理实现Codex插件低成本切换DeepSeek API