ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二进制状态压缩对应 bool 数组中的常用操作

2021-08-05 02:02:17  阅读:188  来源: 互联网

标签:二进制 取反 整数 一位 按位 数组 操作 bool


前置知识

位运算,状态压缩基本原理。

二进制操作 符号 运算规则
按位与 & 对于每一位二进制数比较,如果都为 1 取 1,否则取 0
按位或 | 对于每一位二进制数比较,如果都为 0 取 0,否则取 1
按位非 ~ 对于每一位二进制,0 变成 1,1 变成 0
按位左移 << 将这个数的二进制表示向左移动一位,越界丢弃,低位补 0
按位右移 >> 将这个数的二进制表示向右移动一位,越界丢弃,高位补 0
按位异或 ^ 对于每一位二进制数比较,如果两个不同取 1,否则取 0

这种运算较为简便,而且常数非常小,在非状态压缩的情况下也经常使用。

二进制数压缩 bool 数组操作

操作 运算
取出整数 \(n\) 在二进制表示下的第 \(k\) 位 (n >> k) & 1
取出整数 \(n\) 在二进制表示下的后 \(k\) 位 n & ((1 << k) - 1)
将整数 \(n\) 在二进制表示下的第 \(k\) 位取反 n ^ (1 << k)
将整数 \(n\) 在二进制表示下的第 \(k\) 位赋 \(1\) n | (1 << k)
将整数 \(n\) 在二进制表示下的第 \(k\) 位赋 \(0\) n & (~(1 << k))

正确性证明

操作 1

将 \(n\) 右移 \(k\) 位后,其末即为第 \(k\) 位。此时将其和 \(1\) 按位与即可舍弃前面所有的位上的数据(原因是 \(1\) 的二进制表示中其他位全部为 \(0\),按位与后的结果也是 \(0\) ),比较最后一位是 \(0\) 还是 \(1\)。若为 \(0\) 则返回 \(0\),反之亦然。

操作 2

将 \(1\) 向左移 \(k\) 位后减 \(1\) 会得到 \(2^k - 1\) 的形式。这样的形式的二进制表达类似于 111...11 ,总共有 \(k-1\) 个 \(1\)。将原数和该数按位或该数,会自动忽略高位,原因同上。同时其原理也是 \(0\) 或 \(1\) 与上 \(1\) 总是等于自身。

操作 3

1 << k 操作的含义同上。\(0\) 或 \(1\) 异或上 \(1\) 总是取反,当 \(0\) 异或 \(1\) 两者不同结果是 \(1\),而 \(1\) 刚好相反。这样可以利用一个形如 100...00 的二进制数,对单个位进行取反,故正确。

操作 4

1 << k 操作的含义同上。\(0\) 或 \(1\) 或上 \(1\) 总是为 \(1\)。这是基础定义,不用 Sora 多解释了。

操作 5

1 << k 操作的含义同上。但是将这个数取反就会得到一个形如 111...11011..111 的数。同时,我们知道 \(0\) 或 \(1\) 与上 \(0\) 总是为 \(0\),\(0\) 或 \(1\) 与上 \(1\) 总是等于自身,那么就相当于修改了第 \(k\) 位为 \(0\)。认为这个操作比较妙。

标签:二进制,取反,整数,一位,按位,数组,操作,bool
来源: https://www.cnblogs.com/Inversentropir-36/p/15101472.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有