位运算详解
0*01 位运算
补码
- 在补码下每个数值都有唯一的表示方式
- 发生算数溢出时,32位无符号整数相当于自动对2^32取模
- 0*3F 3F 3F 3F 满足一下两个条件
- 整数的两倍不超过int能表示的最大整数
- 整数的每个字节都是相同的
移位运算
左移
在二进制下把数字同时向左移动,低位以0填充,高位越界后舍弃
右移
在二进制下把数字同时向右移动,高位以符号位填充,低位越界后舍弃
例题
-
求ab%p的值,1<=a,b,p<=109
枚举二进制下每位,没了……
#include<bits/stdc++.h>//a^b%p using namespace std; int a,b,p; int power(){ int ans=1%p; for(;b;b>>=1){ //取遍所有数位 if(b&1) ans=(long long)ans*a%p; //取当前最后一位 a=(long long)a*a%p; } return ans; } int main(){ scanf("%d%d%d",&a,&b,&p); printf("%d",power()); return 0; }
-
求a*b%p的值,1<=a,b,p<=10^18
更神奇的算法……时间复杂度O(n)
#include<bits/stdc++.h> //时间复杂度O(n)的神奇算法 a*b%p using namespace std; typedef unsigned long long ull; ull a,b,p; ull mul(){ a%=p,b%=p; ull c=(long double)a*b/p; ull x=a*b,y=c*p; long long ans=(long long)(x%p)-(long long )(y%p ); if(ans<0) ans+=p; return ans; } int main(){ scanf("%lld %lld %lld",&a,&b,&p); printf("%lld",mul()); return 0; }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
· 易语言 —— 开山篇