二进制,位运算,快速幂
二进制位运算
- 一,前言
- 二,取整运算
- 三,七种位运算
- 1,&:与运算,遇0则0
- 2,|: 或运算,遇1则1。
- 3,~:取反,0变1,1变0
- 4,^:异或运算
- 5, <<<<<< :算数左移,低位填充0,高位舍弃
- 6, >>>>>> :算数右移,高位补符号位,符号位为0就补0,为1补1,同时舍弃低位
- 7,>>>>>>>>> :无符号右移。高位不管符号位是0还是1,都是补0
- 8,位运算和集合的关系
- 四,位运算应用
- 1,有关快速幂
- 取余运算的性质
- 1.1快速幂取余(基于倍增)
- 1.2快速积取余
- 2 ,二的非负整数幂
- 3,对机器数每一位操作(获取,设置,取反)
一,前言
(15)10=(1111)2 …[左边](第3位,第2位,第1位,第0位)[右边]
二,取整运算
下取整函数在数学中一般记作⌊x⌋\lfloor x \rfloor⌊x⌋或者E(x),在计算机科学中一般记作floor(x),表示不超过x的整数中最大的一个
floor()是向负无穷大舍入,floor(-10.5) == -11;
上取整函数在数学中一般记作⌈x⌉\lceil x \rceil⌈x⌉,在计算机科学中一般记作ceil(x),表示不小于x的整数中最小的一个
ceil()是向正无穷大舍入,ceil(-10.5) == -10
四舍五入取整,计算机科学中的round(x),如round(-1.3)=-1;round(-1.52)=-2;round(1.3)=1;round(1.52)=2
向零取整,计算机科学中的 fix(x),fix(-1.3)=-1; fix(1.3)=1,简单来讲,负数的上取整,正数的下取整
三,七种位运算
声明:按位运算,每一位都服从这样的法则
对象:机器数即补码(正数补码=源码,负数是取反+1)
1,&:与运算,遇0则0
如:1 & 1=1,1 & 0=0。只要有0结果就是0。
2,|: 或运算,遇1则1。
如:1 | 1=1,1 | 0=1。只要有1结果就是1。
3,~:取反,0变1,1变0
有符号整数的符号位在 ~ 运算中同样会取反。
4,^:异或运算
口诀:不进位加(相同为0,相异为1)。
如:1 ^ 0=1,1 ^ 1=0
异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变
5, <<<<<< :算数左移,低位填充0,高位舍弃
对一个负数执行左移操作是不可能的
6, >>>>>> :算数右移,高位补符号位,符号位为0就补0,为1补1,同时舍弃低位
原来在数中是第 kkk 位的话,右移移 xxx 位后就是第k−xk-xk−x位
7,>>>>>>>>> :无符号右移。高位不管符号位是0还是1,都是补0
8,位运算和集合的关系
四,位运算应用
1,有关快速幂
n<<m等价于计算n∗(2m)n << m 等价于 计算 n*(2^m)n<<m等价于计算n∗(2m)
n>>m等价于计算n/(2m)n >> m 等价于 计算 n/( 2^m)n>>m等价于计算n/(2m),注意右移运算是绝对下取整,想要获取负数的正常数学商要 -1的
取余运算的性质
(A+B)modb=(Amodb+Bmodb)modb(A+B) \mod b = (A \mod b + B \mod b) \mod b(A+B)modb=(Amodb+Bmodb)modb
(A×B)modb=((Amodb)×(Bmodb))modb(A×B) \mod b = ((A \mod b) × (B \mod b)) \mod b(A×B)modb=((Amodb)×(Bmodb))modb
1.1快速幂取余(基于倍增)
题面:给三个整数 a,k,pa,k,pa,k,p,求 akmodpa^k \bmod pakmodp
思路:k其实就可以拆成2的无数次方的和
预处理:令x=2i,i属于[0−9(最大了)]知道axmodp的值令x=2^i,i属于[0- 9(最大了) ]知道 a^x\bmod p的值令x=2i,i属于[0−9(最大了)]知道axmodp的值
利用同余的性质,凡该二进制位是1,那就ans∗ans*ans∗上对应的已知modmodmod 值再 modmodmod
int qmi(int a,int k,int p)
{int res=1;while(k){if(k&1)res=(long long)res* a %p;k>>=1;a=(long long)a*a%p;}return res;
}
1.2快速积取余
题面:给三个整数 a,b,pa,b,pa,b,p,求 a∗bmodpa*b \bmod pa∗bmodp
思路:
1,先用倍增 X 性质1分别求a,b mod k的值
2,在用个性质2,得解
2 ,二的非负整数幂
判断一个数是不是二的非负整数次幂{ return n > 0 && (n & (n - 1)) == 0; }
对 2 的非负整数次幂取模:{ return x & (mod - 1); }
3,对机器数每一位操作(获取,设置,取反)
获取 a 的第 b 位,最低位编号为 0
int getBit (int a, int b) { return (a >> b) & 1; }
将 a 的第 b 位设置为 0 ,最低位编号为 0
int setBit (int a, int b) { return a & ~(1 << b); }
将 a 的第 b 位设置为 1 ,最低位编号为 0
int setBit(int a, int b) { return a | (1 << b); }
将 a 的第 b 位取反 ,最低位编号为 0
int flapBit(int a, int b) { return a ^ (1 << b); }
大量摘自oi wiki(逃~~~)位运算 oi wiki
二进制,位运算,快速幂相关推荐
- 洛谷 1226 取余运算||快速幂
洛谷 取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...
- 洛谷——P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...
- java位运算求幂,程序员必学:快速幂算法
前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...
- 取余运算||快速幂(洛谷-P1226)
题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" ...
- python pow函数——幂运算 快速幂算法实现思路
说明 python 内置pow函数用于实现幂的运算,在这里我使用的是快速幂算法实现pow函数功能. 快速幂 快速幂算法本质上基于的是分治思想. 优点:其时间复杂度为 O (log₂N), 与暴力遍历时 ...
- 颠倒二进制[位运算]
颠倒二进制 前言 一.颠倒二进制 二.解 1.逆序存储 2.分治颠倒 总结 参考文献 前言 颠倒二进制,可以直接将二进制逆序存储,得到新的数:也可分治快速颠倒. 一.颠倒二进制 二.解 1.逆序存储 ...
- s - 指数运算-快速幂实现
s - 指数运算 时间限制:1秒 内存限制:128兆 254 次提交 70 次通过 提交 题目描述 写一个程序实现指数运算 X^N.(1<X<10,0<N<20) 输入 输入包 ...
- 一个数值转化为二进制 位运算和位域
在嵌入式系统和单片机开发中,数值转化为二进制是非常常用的,对与位域可能很多上层开发人员都 不曾见到,位域在MCU开发中常用的使用的,例如一个开关量和高低电平信号,只用0和1两种状态. 下面是我做项目时 ...
- 快速幂 算法学习笔记
快速幂 学习笔记 文章目录 快速幂 学习笔记 概念与使用缘由 两种方法 1.用位运算的方法 位运算原理 位运算所需要用到的运算符 主程序如下: 程序解析 概念与使用缘由 快速幂,顾名思义,就是用比一个 ...
- 快速幂算法 超详细教程
快速幂 求幂运算 快速幂引入 快速幂 二进制 快速幂 指数折半 快速幂的应用 求幂运算 求幂运算大家都不陌生,幂是指数运算的结果,当m是正整数时nᵐ的意义为m个n相乘,n的m次幂也就是n的m次方.用代 ...
最新文章
- java printwriter format_Java的格式化输出
- js 输出二维数组的最大值
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon
- hadoop hdfs (java api)
- 动态更新纹理闪烁问题
- 如何申请注销腾讯视频账号
- mongdb安装配置
- OpenShift 4 Hands-on Lab (7) - 用Jenkins Pipeline实现在不同运行环境中升迁部署应用
- Web服务器常用设置
- Bash命令的学习笔记(legacy)
- Spring MVC PathVariable
- CentOS7图形界面模式
- C语言解释器的实现--让脚本跑起来(六)
- linux安装为知笔记本,Scientific Linux 安装 wiznote(为知笔记)
- 高通 MSM8K bootloader 之四: ramdump
- ESP8266刷入MicroPython固件教程
- HID 报告描述符的填充方式
- NID-00135: There are 1 active threads错误
- 江苏统考计算机英语作文,高考江苏英语作文范文
- SQL获取当前年第一天日期 MYSQL获取当前年第一天
热门文章
- 旅游路线的查询的测试用例(全)
- Qt错误:Error while building/deploying project
- 计算机毕设 SpringBoot 智慧养老平台 养老院管理系统 养老信息管理系统 Java Vue MySQL数据库 远程调试 代码讲解
- android Setting添加配置项
- 教妹学Java:数组专用工具类 Java.util.Arrays
- 抖音用户数据获取分析(未完成)
- 百度飞桨:春节写春联:你写上联,AI写下联
- Talk | 微软亚洲研究院宋恺涛南大余博涛:面向文本/音乐序列任务的Transformer注意力机制设计
- 【zz】owt-server:音视频转发示意图
- filebeat 莫名其妙自动挂掉