扒了几篇博文,都是一些不符合需求的,对于一个数学渣渣来说,说的太简洁是会要命的,自己总结一下我碰到过的二进制。

参考资料:https://jingyan.baidu.com/article/1612d5008ff5b7e20f1eee4c.html


位运算(位运算符用来对二进制位进行操作

  算术位运算:

<1> 与:(and  / &);< 2> 或:(or  /  | );  <3> 非:( not  /  ~ )  <4>  异或:( xor )

  移位运算:

   <1> 算术左移: <<

<2> 算术右移: >>

用法及实例:

     指定两个数 A = 60(0011 1100); B = 13 (0000 1101)

  1. 按位与(&)

    对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1,如下图:

    (A & B) 结果为 12, 二进制为 0000 1100

  2. 按位或(|)

    比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1),如下图:

    (A | B) 结果为 61, 二进制为 0011 1101

  3. 按位异或(^)

    比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0,如下图:

    (A ^ B) 结果为 49, 二进制为 0011 0001

  4. 按位取反(~)

    对一个操作数的每一位都取反,如下图:

    (~A ) 结果为 -61, 二进制为 1100 0011

  5. 按位左移(<<)

    将操作数的所有位向左移动指定的位数。

    下图展示了11111111 << 1(11111111 左移一位)的结果。蓝色数字表示被移动位,灰色表示被丢弃位,空位用橙色的0填充。

    (A << 2)结果为 240, 二进制为 1111 0000

  6. 按位右移(<<)

    将操作数的所有位向又移动指定的位数。

    下图展示了11111111 >> 1(11111111 右移一位)的结果。蓝色数字表示被移动位,灰色表示被丢弃位,空位用橙色的0填充。

    A >> 2 结果为 15, 二进制为 0000 1111


带有二进制算法的程序

1》求 m^n mod k =?

#include<stdio.h>
using namespace std;
int m,n,k;
int main(){scanf("%d%d%d",&m,&n,&k);int ans=1;for(;n;n>>=1,m=(long long)m*m%k)if(n&1)ans=(long long) ans*m%k;printf("%d\n",ans);return 0;
}

关于这个小程序的详解:https://blog.csdn.net/sodacoco/article/details/81587705

2》辗转相除法的二进制算法

1--原来的gcd算法代码

int GCD(int x,int y){return y==0?x:GCD(y,a%b);
}

2--二进制改进后的gcd算法

原理:(原理大部分都是对的,看不懂就再看,想不通就拿数字验证,强势理解它的存在,--来自一个数渣儿的蒟蒻经验)

如果想进一步提高GCD的效率,可以通过不断去除因子2来降低常数,这就是所谓的“二进制算法”。

具体实现:

若x=y,则GCD(x,y)=x,否则:

A,若 x,y 均为偶数 , 则GCD(x,y)=GCD(x/2 , y/2 ) ;

B,若x为偶数,y为奇数 , 则GCD(x,y)=GCD(x/2 , y) ;

C,若x为奇数,y为偶数 , 则GCD(x,y)=GCD(x , y/2) ;

D,若 x,y 均为奇数 , 则GCD(x,y)=GCD(x-y, y) ;

#include<stdio.h>
#include<iostream>
using namespace std;
inline int GCD(int x,int y){int i,j;if(x==0)return y;if(y==0)return x;for(j=0;0==(x&1);++i) x>>=1;    //去掉所以的2for(j=0;0==(y&1);++j) y>>=1;    //去掉所有的2if(j<i) i=j;while(1){if(x<y) x^=y,y^=x,x^=y;     //若x<y交换x,yif(0==(x-=y)) return y<<i;//若x==y,gcd==x==y(就是在辗转相减,while(1)控制)while(0==(x&1))x>>=1;       //去掉所有的2}
}int main(){int x,y;while(1){cin>>x>>y;cout<<GCD(x,y)<<endl;}return 0;
}

在原程序中插入一些cout,观察程序运行的具体方式(用乾隆的话说:盖满朕的大 cout 印 )

(不懂的童鞋可以酱紫强势看懂程序,只不过有些麻烦)

#include<stdio.h>
#include<iostream>
using namespace std;//递归输出二进制函数
void BinaryRecursion(int n)
{int a;a=n%2;n=n>>1;if (n==0);elseBinaryRecursion(n);cout<<a;
}inline int GCD(int x,int y){cout<<"   ----------"<<endl;
cout<<"   x="<<x<<"   y="<<y<<endl;int i,j;if(x==0)return y;if(y==0)return x;cout<<"   x去掉2之前="<<x<<"  二进制形式=";BinaryRecursion(x);cout<<endl;for(j=0;0==(x&1);++i) x>>=1;    //去掉所以的2cout<<"   x去掉2之后="<<x<<"  二进制形式=";BinaryRecursion(x);cout<<endl;cout<<"   y去掉2之前="<<y<<"  二进制形式=";BinaryRecursion(y);cout<<endl;for(j=0;0==(y&1);++j) y>>=1;    //去掉所有的2cout<<"   y去掉2之后="<<y<<"  二进制形式=";BinaryRecursion(y);cout<<endl;
cout<<" i="<<i<<endl;
cout<<" j="<<j<<endl;if(j<i) i=j;while(1){cout<<"   ==========="<<endl;
cout<<"   x="<<x<<"  y="<<y<<endl;if(x<y) x^=y,y^=x,x^=y;     //若x<y交换x,yif(0==(x-=y)) {
cout<<"y<<"<<i<<"="<<(y<<i)<<endl;return y<<i;}//若x==y,gcd==x==y(就是在辗转相减,while(1)控制)while(0==(x&1))x>>=1;       //去掉所有的2}
}int main(){int x,y;while(1){cin>>x>>y;cout<<GCD(x,y)<<endl;}return 0;
}

在此插播一条博客,c++输出二进制形式数字的几种算法:https://blog.csdn.net/sodacoco/article/details/81624915  ,上面的牛皮*的一块。

以20,100 为例,运行结果:

这样结合上述原理,不说完全理解,实现过程应该明白的差不多了。


暂且整理这两个程序,对于二进制兴致大发是因为最近做的 组合数 的题目,大意是,求1-n中,与k互质的数,大意是将k分解质因子,然后从1-n中去除,用到了容斥定理,这些都能理解,自己也想明白了,就是搞不懂该怎么代码实现,看题解,看一个,二进制实现,看一个,二进制实现,硬着头皮去请教大佬二进制,结果还是没怎么明白,大佬默默的说了一句,下面的题好多都是二进制实现的,稍微看了一下,都说二进制能够实现好多不好实现的算法,再看看。

二进制+位操作 总结相关推荐

  1. python中指定变量为1byte_Python读字节某一位的值,设置某一位的值,二进制位操作...

    Python读字节某一位的值,设置某一位的值,二进制位操作 ??在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1.True和Fa ...

  2. python获取二进制bit位_Python读字节某一位的值,设置某一位的值,二进制位操作...

    Python读字节某一位的值,设置某一位的值,二进制位操作 在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1.True和Fals ...

  3. Python读字节某一位的值,设置某一位的值,二进制位操作

    Python读字节某一位的值,设置某一位的值,二进制位操作   在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1.True和Fa ...

  4. 抛砖引玉:使用二进制位操作,解决铁道部火车票的数据查询和存储问题,超轻量级的解决方案...

    又到节假日,园子里面不少高人再次对12306网站的各种问题的各种分析和提出各种解决方案,我也看了这些讨论文章,出于也是一个买票难的"码农",也来献计献言,把我跟其他人讨论的结果汇总 ...

  5. C语言、嵌入式位操作精华技巧大汇总

    最近有点忙,好久没分享笔记了~今天分享关于位操作的一点小笔记. 一.位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位 ...

  6. Lua进行二进制文件的位操作

    1.纯lua的二进制位操作 lua的二进制文件主要利用string.byte()读取某个字节,string.char()写入,示例代码如下: function v:xorFile(inputFile, ...

  7. C语言位操作 - bit 、byte的清零,置1,提取,判断

    一.位操作概述 针对MCU的嵌入是开发中经常涉及到寄存器的操作,例如GPIO配置低寄存器GPIOx_CRL(共32个bit),有时需要改变其中的一位或者几位bit值,同时不能影响其它bit位的值. 例 ...

  8. Python中整数移位及二进制串操作

    Python中整数移位及二进制串操作 最近一个项目涉及到电压数据的接收和可视化处理.其中电压数据是由FPGA通过TCP协议传输的二进制流,软件接收端需要安装数据帧格式进行解析后处理.由于嵌入式组的FP ...

  9. Vulkan Tutorial 12 Fixed functions

    Vertex input VkPipelineVertexInputStateCreateInfo结构体描述了顶点数据的格式,该结构体数据传递到vertex shader中.它以两种方式进行描述: B ...

最新文章

  1. Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)
  2. Vue源码探究-全局API
  3. Prism框架研究(一)
  4. tomcat架构分析(connector BIO 实现)【转】
  5. mysql root 不能登录_mysql root 用户不能登录的问题
  6. 提权学习之旅——Linux操作系统提权
  7. Django(part2)--创建项目与Django目录结构
  8. 【安全】Docker安装LDAP
  9. 03 验证合法性连接的服务端
  10. 多校训练 Naive Operations线段树区间更新
  11. c++ static 关键字总结
  12. 阿里云资深专家起底云网络平台的技术架构升级之路-洛神3.0
  13. QQ所有文件和目录详细分析
  14. 排序算法总结(Python实现)——(一)
  15. 转:getaddrinfo函数详解
  16. 应聘人工智能岗位?这10个必问的面试题,你准备好了吗
  17. 阿里任务调度SchedulerX2.0和阿里云大数据任务结合
  18. html导出excel表头多了一行空行,excel中有时候表格下面有很多空行,下拉条滚动一点就过了很多行,怎么取消掉多余的行啊?(excel表头每页都显示)...
  19. JavaScript(订单的增删改)
  20. Spark 3.x各模式部署 - Ubuntu

热门文章

  1. 【排列组合】扑克牌大小王被同一人拿到概率
  2. LabVIEW编程LabVIEW开发 旧程序升级维护
  3. labview教学视频:http://www.51zxw.net/study.asp?vip=19649795
  4. Qt编写地图综合应用55-海量点位标注
  5. 四年开发,待业半年本想放弃Java,抱着试试的心态面试某C轮金融科技公司居然过了!
  6. 《Spark实时词频统计处理系统》
  7. 【无标题】免费源码资源,游戏源码下载
  8. 极速office(excel)如何查找出重复内容
  9. 苹果5更新系统无服务器,苹果5手机系统更新不了出现无法检查更新怎么处理
  10. 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题