c++ 输出二进制_【位运算与状态压缩】二进制的魅力
【引言】
今天讲讲位运算与状态压缩。
位运算涉及系统底层的运算,骚操作很多;状态压缩则是编程中空间优化的有效手段,应该说两者本身其实并没有太直接的联系,但是在实际使用时会有一定的结合,所以还是放到一起讲。
【位运算介绍】
我们知道程序中的所有数字(不止数字,包括图片、视频等任何元素)在计算机内存中都是以二进制的形式储存的,而位运算就是直接对二进制进行操作。
计算机中的数字都以二进制的形式存储
听起来似乎很高大上,事实上用起来很简单,我们先看看常见的两个位运算:"按位与(&)"、"按位或(|)"
例.
a
=
5
; b
=
6
print
(a & b)
print
(a | b)
输出结果:
4
7
为什么是这个结果?
因为系统中:
"5"的二进制是"101"
"6"的二进制是"110"
而其运算方式是"一位一位"地算(都叫位运算了嘛)。
首先是"按位与":
1 0 1
& 1 1 0
——————
1 0 0
可以注意到每一位都是按照"与"地方式计算的,即:
1 & 1 → 1
0 & 1→ 0
1 & 0→ 0
接下来是"按位或":
同理,每一位都进行"或运算",得到"111"。
这就是位运算,每一个二进制位进行相应的运算得到结果(C++入门被&和&&两个符号坑过的举爪...)。
PYTHON3中常用位运算有6种,包括:
按位与(&):运算时,都为1则为1,否则0
按位或(|):其中一个为1时则结果1,否则0
按位异或(^):不同为1,相同为0
按位取反(~):每一位进行0和1的变换
左移(<向右移动N位,高位补0,低位去掉
右移(>>):向左侧移动N位,高位去掉,低位补0
①按位与:
5 & 6 → 4
②按位或:
5 | 6 → 7
③按位异或:
5 ^ 6 → 3
④按位取反:
~5 → 2
⑤左移:
5 << 1 → 1
⑥右移:
5 >> 1 → 2
位运算的骚操作:结合位运算,可以优化许多功能
①将整数x整除2或乘以2:
x >> 1 即整除2
x << 1 即乘以2
这里用到了二进制的原理,由于位运算是相对更为底层的运算,所以速度更快
②将整数x在二进制的右数第k位取反:
x ^ (1<
例. 将数字7在二进制下的第2位取反,则:
7 ^ (1<
即,(111)2 ^ (10)2 → (101)2
(什么?你问这个操作有什么用?该有用时自会有用,,,)
③获取整数x在二进制下的最低位的1(即最右边的1):
x&-x(树状数组专用,暂时不解释了)
④将整数x在二进制下最低位的1变成0:
x = x&(x-1)
一般用于求解x在二进制下1的个数,例.
a
=
5
; c
=
0
while
a>
0
:
a
=
a & a
-
1
c
+
=
1
print
(c)
输出为2,因为5的二进制是101,第一次先将最右边的1变为0,则101→100,第二次循环继续将最右边的1变为0,则100→000,循环结束。
差不多常用的就这些了。
【状态压缩介绍】
又是一个听起来很厉害实际上不是太难(但也可以难上天)的算法。说白了,就是用一个十进制数表示一个集合的状态。
例如,有5盏灯,这5盏灯有的开着,有的关闭,我们就可以用一串0和1来表示这5盏灯(1表示开,0表示关),则看为二进制数就是10110,即22。
这样一来,我们可以用22表示当前5盏灯的状态,免去了数组的存储,在空间上进行了优化,也给映射之类的操作提供了方便(比如可以将这些状态作为数组下标处理)。
那么如果某一盏灯变化了状态怎么办?
还记得位运算的第2个骚操作么,例如左数第四盏灯如果关闭了,则只需将二进制下的右数第二位取反即可,也就是22^(1<,即二进制下的10100。
状态压缩本质是利用二进制表示一个集合的状态(当然如果状态种类比较多,则可能有三进制、四进制甚至更多,例如5个人玩石头剪刀布,则每一组方案需要利用3进制表示,因为每个人有石头剪刀布三种状态)。而状态改变时就需要操作对应的十进制数,也就是利用到位运算了。
状态压缩最常见的应用是与动态规划的结合,这不是本篇的重点,关于状压动规还是先挖个坑吧,是挺有意思的算法。
另一个冷门应用就是二进制枚举法,详见之前的文章:二进制枚举法
c++ 输出二进制_【位运算与状态压缩】二进制的魅力相关推荐
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp
文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...
- java 二进制位运算_Java中的二进制与位运算
大家在阅读一些算法或者一些开源框架的时候,总会见到~,>>,>>>,|这种大量的位运算,因此想要读明白 这部分代码,对于计算机的二进制操作以及位运算是必须要了解的,那么本 ...
- 超有趣的二进制—高效位运算秒懂
附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①[Java]学习之路吐血整理技术书 ...
- python二进制移位_python学习特辑——二进制和位运算篇
以前学习java的时候,二进制和位运算只停留在"懂"的程度,从来没有花时间去推导和总结,作为一个数学系的学生,一直想花点时间做推理证明 java和python关于二进制和位运算的规 ...
- 位运算求整数中二进制1的个数
package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...
- c语言用位运算将一个数清零,C语言学习笔记_位运算
C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...
- Python——二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】
Python--二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add16bit.py 2.结果示例 3.下篇文章预告 [功能模块作者] CSDN用户(TDTX),TDT ...
- Python——二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】
Python--二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add8bit.py 2.结果示例 [功能模块作者] CSDN用户(TDTX),TDTX主页--负责加法功能 ...
- excel二进制移位运算_位运算-秦斌的博客-51CTO博客
1.位运算介绍 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作. 2.位运算符号 Java中的运算符号: & : 按位与 |:按位 ...
最新文章
- framebuffer的入门介绍-实现程序分析【转】
- JTS基本概念和使用
- linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)
- 服务器按ctrl alt delete没有用_用完这些快捷键,我再也回不去了(Win系统篇)
- Aruba 云服务代金券
- MATLAB VMD分解 变分模态分解 信号预处理 特征提取 及其改进算法
- 赤手空拳如何成就百万富翁? 赤手空拳如何成就百万富翁?——网络营销之七(第四招:百度文库+)...
- 游戏设计艺术 第2版 (Jesse Schell 著)
- 系统学Android从零开始,附超全教程文档
- java 6个逆向工程软件
- 公私钥加解密+数字签名原理图(原创)
- 惊爆:普通人也能监听你MSN聊天(转)
- 架构设计的深入思考与总结——概述
- 使用Nginx访问日志统计PV和UV
- 开发指南专题六:JEECG微云快速开发平台代码生成
- 微信智慧支付日系统服务器崩溃,微信支付大面积出现故障 微信支付系统繁忙怎么解决 微信支付崩溃原因是什么...
- 什么是创意啊?这才是创意
- vmware虚拟机桥接模式在有线/无线双网卡解决方案
- mysql登录其他电脑_如何连接另一台电脑的mysql数据库
- 300道SpringCloud面试题及答案(最新整理)
热门文章
- 在查询语句中使用 NOLOCK 和 READPAST
- Service Broker实现发布-订阅(Publish-Subscribe)框架(3)
- Mysql-innoDB存储引擎(事务,锁,MVCC)
- sublime text 3在windows中配置ctags插件
- Linux配置apache虚拟主机:静态文件
- Linux的Nginx九:负载均衡
- 用图表说话 麦肯锡 pdf下载_揭秘麦肯锡顾问百万年薪背后的逻辑,麦肯锡「方法论」系列大合集...
- layui table 单元格适应宽高
- web开发中常用的算法和函数
- 招商局集团内部控制手册pdf_企业内部控制流程手册,全文22模块,内容很全面,可直接打印使用...