二进制位运算

  • 一,前言
  • 二,取整运算
  • 三,七种位运算
    • 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

二进制,位运算,快速幂相关推荐

  1. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  2. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...

  3. java位运算求幂,程序员必学:快速幂算法

    前阵子,有小伙伴在我B站的算法教程底下留言 小伙伴们有任何疑问或者希望我解说任何内容,都可以在我的小我私家B站或民众号(xmg_mj)留言哦,我会尽我最大能力.只管抽时间去写文章\录视频来回应人人. ...

  4. 取余运算||快速幂(洛谷-P1226)

    题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" ...

  5. python pow函数——幂运算 快速幂算法实现思路

    说明 python 内置pow函数用于实现幂的运算,在这里我使用的是快速幂算法实现pow函数功能. 快速幂 快速幂算法本质上基于的是分治思想. 优点:其时间复杂度为 O (log₂N), 与暴力遍历时 ...

  6. 颠倒二进制[位运算]

    颠倒二进制 前言 一.颠倒二进制 二.解 1.逆序存储 2.分治颠倒 总结 参考文献 前言 颠倒二进制,可以直接将二进制逆序存储,得到新的数:也可分治快速颠倒. 一.颠倒二进制 二.解 1.逆序存储 ...

  7. s - 指数运算-快速幂实现

    s - 指数运算 时间限制:1秒 内存限制:128兆 254 次提交 70 次通过 提交 题目描述 写一个程序实现指数运算 X^N.(1<X<10,0<N<20) 输入 输入包 ...

  8. 一个数值转化为二进制 位运算和位域

    在嵌入式系统和单片机开发中,数值转化为二进制是非常常用的,对与位域可能很多上层开发人员都 不曾见到,位域在MCU开发中常用的使用的,例如一个开关量和高低电平信号,只用0和1两种状态. 下面是我做项目时 ...

  9. 快速幂 算法学习笔记

    快速幂 学习笔记 文章目录 快速幂 学习笔记 概念与使用缘由 两种方法 1.用位运算的方法 位运算原理 位运算所需要用到的运算符 主程序如下: 程序解析 概念与使用缘由 快速幂,顾名思义,就是用比一个 ...

  10. 快速幂算法 超详细教程

    快速幂 求幂运算 快速幂引入 快速幂 二进制 快速幂 指数折半 快速幂的应用 求幂运算 求幂运算大家都不陌生,幂是指数运算的结果,当m是正整数时nᵐ的意义为m个n相乘,n的m次幂也就是n的m次方.用代 ...

最新文章

  1. java printwriter format_Java的格式化输出
  2. js 输出二维数组的最大值
  3. The 2018 ACM-ICPC Chinese Collegiate Programming Contest B. Rolling The Polygon
  4. hadoop hdfs (java api)
  5. 动态更新纹理闪烁问题
  6. 如何申请注销腾讯视频账号
  7. mongdb安装配置
  8. OpenShift 4 Hands-on Lab (7) - 用Jenkins Pipeline实现在不同运行环境中升迁部署应用
  9. Web服务器常用设置
  10. Bash命令的学习笔记(legacy)
  11. Spring MVC PathVariable
  12. CentOS7图形界面模式
  13. C语言解释器的实现--让脚本跑起来(六)
  14. linux安装为知笔记本,Scientific Linux 安装 wiznote(为知笔记)
  15. 高通 MSM8K bootloader 之四: ramdump
  16. ESP8266刷入MicroPython固件教程
  17. HID 报告描述符的填充方式
  18. NID-00135: There are 1 active threads错误
  19. 江苏统考计算机英语作文,高考江苏英语作文范文
  20. SQL获取当前年第一天日期 MYSQL获取当前年第一天

热门文章

  1. 旅游路线的查询的测试用例(全)
  2. Qt错误:Error while building/deploying project
  3. 计算机毕设 SpringBoot 智慧养老平台 养老院管理系统 养老信息管理系统 Java Vue MySQL数据库 远程调试 代码讲解
  4. android Setting添加配置项
  5. 教妹学Java:数组专用工具类 Java.util.Arrays
  6. 抖音用户数据获取分析(未完成)
  7. 百度飞桨:春节写春联:你写上联,AI写下联
  8. Talk | 微软亚洲研究院宋恺涛南大余博涛:面向文本/音乐序列任务的Transformer注意力机制设计
  9. 【zz】owt-server:音视频转发示意图
  10. filebeat 莫名其妙自动挂掉