【引言】

今天讲讲位运算状态压缩

        位运算涉及系统底层的运算,骚操作很多;状态压缩则是编程中空间优化的有效手段,应该说两者本身其实并没有太直接的联系,但是在实际使用时会有一定的结合,所以还是放到一起讲。

【位运算介绍】

我们知道程序中的所有数字(不止数字,包括图片、视频等任何元素)在计算机内存中都是以二进制的形式储存的,而位运算就是直接对二进制进行操作。

计算机中的数字都以二进制的形式存储

听起来似乎很高大上,事实上用起来很简单,我们先看看常见的两个位运算:"按位与(&)"、"按位或(|)"

例.

= 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的个数,例.

= 5; c = 0

while a>0:

    = a & a-1

    += 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++ 输出二进制_【位运算与状态压缩】二进制的魅力相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  2. java 二进制位运算_Java中的二进制与位运算

    大家在阅读一些算法或者一些开源框架的时候,总会见到~,>>,>>>,|这种大量的位运算,因此想要读明白 这部分代码,对于计算机的二进制操作以及位运算是必须要了解的,那么本 ...

  3. 超有趣的二进制—高效位运算秒懂

    附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①[Java]学习之路吐血整理技术书 ...

  4. python二进制移位_python学习特辑——二进制和位运算篇

    以前学习java的时候,二进制和位运算只停留在"懂"的程度,从来没有花时间去推导和总结,作为一个数学系的学生,一直想花点时间做推理证明 java和python关于二进制和位运算的规 ...

  5. 位运算求整数中二进制1的个数

    package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...

  6. c语言用位运算将一个数清零,C语言学习笔记_位运算

    C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...

  7. Python——二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】

    Python--二进制16位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add16bit.py 2.结果示例 3.下篇文章预告 [功能模块作者] CSDN用户(TDTX),TDT ...

  8. Python——二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现)【2021-07-08】

    Python--二进制8位加法器(采用手算二进制加法的过程实现)(tkinter实现) 1.add8bit.py 2.结果示例 [功能模块作者] CSDN用户(TDTX),TDTX主页--负责加法功能 ...

  9. excel二进制移位运算_位运算-秦斌的博客-51CTO博客

    1.位运算介绍 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作. 2.位运算符号 Java中的运算符号: & : 按位与 |:按位 ...

最新文章

  1. framebuffer的入门介绍-实现程序分析【转】
  2. JTS基本概念和使用
  3. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(oracle基础配置_04)
  4. 服务器按ctrl alt delete没有用_用完这些快捷键,我再也回不去了(Win系统篇)
  5. Aruba 云服务代金券
  6. MATLAB VMD分解 变分模态分解 信号预处理 特征提取 及其改进算法
  7. 赤手空拳如何成就百万富翁? 赤手空拳如何成就百万富翁?——网络营销之七(第四招:百度文库+)...
  8. 游戏设计艺术 第2版 (Jesse Schell 著)
  9. 系统学Android从零开始,附超全教程文档
  10. java 6个逆向工程软件
  11. 公私钥加解密+数字签名原理图(原创)
  12. 惊爆:普通人也能监听你MSN聊天(转)
  13. 架构设计的深入思考与总结——概述
  14. 使用Nginx访问日志统计PV和UV
  15. 开发指南专题六:JEECG微云快速开发平台代码生成
  16. 微信智慧支付日系统服务器崩溃,微信支付大面积出现故障 微信支付系统繁忙怎么解决 微信支付崩溃原因是什么...
  17. 什么是创意啊?这才是创意
  18. vmware虚拟机桥接模式在有线/无线双网卡解决方案
  19. mysql登录其他电脑_如何连接另一台电脑的mysql数据库
  20. 300道SpringCloud面试题及答案(最新整理)

热门文章

  1. 在查询语句中使用 NOLOCK 和 READPAST
  2. Service Broker实现发布-订阅(Publish-Subscribe)框架(3)
  3. Mysql-innoDB存储引擎(事务,锁,MVCC)
  4. sublime text 3在windows中配置ctags插件
  5. Linux配置apache虚拟主机:静态文件
  6. Linux的Nginx九:负载均衡
  7. 用图表说话 麦肯锡 pdf下载_揭秘麦肯锡顾问百万年薪背后的逻辑,麦肯锡「方法论」系列大合集...
  8. layui table 单元格适应宽高
  9. web开发中常用的算法和函数
  10. 招商局集团内部控制手册pdf_企业内部控制流程手册,全文22模块,内容很全面,可直接打印使用...