当前位置: 首页 > news >正文

位屏蔽(Bitmasking)中屏蔽字赋值语句 mask | (1 << j) 的解释

位屏蔽(Bitmasking)中屏蔽位赋值语句 mask | (1 << j) 的解释

什么是位屏蔽

位屏蔽是一种以较小代价标识大量数据的方法,比如一个有N个元素的集合,我们可以用一个N位(bit)的值来表示这个集合的子集合。这个值通常被称为mask(屏蔽字)。
例如 10000101 表示集合[1,2,3 … 8]的子集合1,3,8 。屏蔽字在保存的时候实际上是一个二进制形式的Integer。

mask | (1 << j)

在算法中,构造子集合时会用到set(i, mask)方法,这个方法内的主要语句是 mask | (1 << i) 。 如果初次见到这个代码,可能会一头雾水,或者误认为这是一个判断条件,实际上这是一句赋值代码。这里有两个运算符需要解释。

  • “|” 或运算符。这个运算符是在二进制计算中的“或”。
    例: 10001001 | 00000110 = 10001111 相信如何运算一目了然。
  • “<<” 左移运算符。将二进制数的各位全部左移若干位,右边空出的位用0填补,高位溢出部分舍弃。
    例:1 << 1 = 10 10000001 << 3 = 00001000

通过上面两个运算符的解释,现在这个赋值语句就容易理解了。首先,(1 << i) 表示将二进制数1左移i位,得到新的二进制数 100…0 (i个0),然后将这个二进制数与mask进行一个或运算。注意这个二进制数除了高位i位,其他都是0,这样进行或运算,实际上是将mask的i位置1。

平时在coding的过程中,我们常接触的是整型数字,突然使用二进制数的值和运算符可能会混淆,难以理解。因此,熟悉二进制数、二进制运算符号也是必要的。

在了解这些基本知识的基础上,接下来的推送我会用位屏蔽结合DP解决一些经典的算法问题。

相关文章:

  • 【Java to Architect】synchronized保证内存可见性 demo的另一种解法
  • 利用位屏蔽和动态规划解决最小代价任务分配问题 Bitmasking Dynamic Programming
  • 算法:回溯法(backtracking)解决寻找给定字符串的所有排序(permutations)问题
  • 算法: 动态规划 寻找2D矩阵中到达某一坐标的最小代价路径
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)
  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 算法: 动态规划 编辑距离 Edit Distance / Levenshtein Distance
  • 【Salesforce】【Apex】Trigger中不通过soql查询记录类型的开发名称
  • 【Programming Languages And Lambda calculi】 1.2 ~ 1.3 关系、赋值与关系
  • 【Programming Languages And Lambda calculi】 1.4 有向赋值
  • 【算法】 动态规划 基础题库 1-7 python实现
  • 【Programming Languages And Lambda calculi】 1.5 ~ 1.7 上下文规约 赋值函数 符号摘要
  • 【Programming Languages And Lambda calculi】第二章 结构归纳法 2.1 基础
  • 【mysql】环境安装、服务启动、密码设置
  • IOS评论框不贴底(ios12新bug)
  • js 实现textarea输入字数提示
  • js对象的深浅拷贝
  • Node 版本管理
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • nodejs实现webservice问题总结
  • Travix是如何部署应用程序到Kubernetes上的
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于字符编码你应该知道的事情
  • AI算硅基生命吗,为什么?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • !!java web学习笔记(一到五)
  • #define、const、typedef的差别
  • $forceUpdate()函数
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (function(){})()的分步解析
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (第二周)效能测试
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (五)网络优化与超参数选择--九五小庞
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .net framework profiles /.net framework 配置
  • .NET 设计模式初探
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET构架之我见
  • .net下简单快捷的数值高低位切换
  • /run/containerd/containerd.sock connect: connection refused
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 数据结构 - C++] AVL树原理及实现
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [AIGC] Redis基础命令集详细介绍
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [BZOJ3223]文艺平衡树
  • [C语言]——C语言常见概念(1)