如何使用位操作符实现低级别的位掩码

在本文中,我们来看看如何使用位操作符实现低级别的位掩码。我们将看到我们如何将一个单一的int变量作为一个单独的数据容器。
位掩码位掩码允许我们在一个数字变量中存储多个值。我们不再把这个变量看作一个整数,而是把它的每一个比特当作一个独立的值。
因为一个比特可以等于 0 或 1,我们也可以把它看成是 false 或 true 。我们也可以把一组比特切开,把它们当作一个较小的数字变量甚至是一个string。
举个例子假设我们有一个最小的内存空间,并且需要在一个int变量中存储所有关于用户账户的信息。前八位(来自32个可用位)将存储boolean信息,如 该账户是否激活?或 该账户是否溢价?
至于剩下的24位,我们将把它们转换成三个字符,作为用户的标识符。
编码我们的用户将有一个标识符 aaa,他将有一个活跃的高级账户(存储在前两个比特)。在二进制表示中,它将看起来像。
string stringrepresentation = 01000001010000010100000100000011;使用内置的integer#parseunsignedint方法,可以很容易地将其编码为一个int变量。
int intrepresentation = integer.parseunsignedint(stringrepresentation, 2);assertequals(intrepresentation, 1094795523);解码这个过程也可以用 integer#tobinarystring 方法来反转。
string binarystring = integer.tobinarystring(intrepresentation);string stringrepresentation = padwithzeros(binarystring);assertequals(stringrepresentation, 01000001010000010100000100000011);提取一个比特第一比特如果我们想检查我们账户变量的第一位,我们只需要使用顺位 and 运算符和数字 1 作为掩码。因为数字 1在二进制形式中只有第一位被设置为1,其余的都是0,它将从我们的变量中删除所有的位,只留下第一个完整的位。
1000001010000010100000100000001100000000000000000000000000000001-------------------------------- &00000000000000000000000000000001然后我们需要检查产生的值是否不等于零。
intrepresentation & 1 != 0任意位置的位如果我们想检查其他的位,我们需要创建一个适当的掩码,这个掩码需要在给定的位置上有一个位设置为1,其余的设置为0。最简单的方法是对我们已有的掩码进行移位。
1 < < (position - 1)上面这行代码的位置变量设置为3,将把我们的掩码从 00000000000000000000000000000001 变成
00000000000000000000000000000100因此,现在,比特方程将看起来像这样。
1000001010000010100000100000001100000000000000000000000000000100-------------------------------- &00000000000000000000000000000000把所有这些放在一起,我们可以写一个方法来提取给定位置上的单个比特。
private boolean extractvalueatposition(int intrepresentation, int position) { return ((intrepresentation) & (1 < > 8;string stringrepresentation = getstringrepresentation(lastthreebites);assertequals(stringrepresentation, 00000000010000010100000101000001);我们仍然有32位,因为int总是有32位。然而,现在我们只对前24位感兴趣,其余的都是零,会很容易被忽略。我们创建的int变量可以很容易地用作整数id,但是因为我们想有一个字符串id,所以我们还有一个步骤要做。
我们将把二进制的字符串表示法分成8个字符的组,把它们解析成char变量,然后把它们连接成一个最终的string。
为了方便起见,我们还将忽略空字节。
arrays.stream(stringrepresentation.split((? !eightbits.equals(00000000)) .map(eightbits - > (char)integer.parseint(eightbits, 2)) .collect(stringbuilder::new, stringbuilder::append, stringbuilder::append) .tostring();应用一个比特掩码我们也可以创建一个掩码来同时检查许多位,而不是提取和检查单个位的值。我们想检查我们的用户是否有一个活跃的高级账户,所以他的变量的前两个比特都设置为1。
我们可以用以前的方法分别检查它们,但创建一个掩码来选择它们,会更快。
int user = integer.parseunsignedint(00000000010000010100000101000001, 2);int mask = integer.parseunsignedint(00000000000000000000000000000011, 2);int masked = user & mask;因为我们的用户有一个活跃的账户,但它不是高级账户,所以被屏蔽的值将只有第一个比特被设置为1。
assertequals(getstringrepresentation(masked), 00000000000000000000000000000001);现在,我们可以轻松而廉价地断言一个用户是否符合我们的条件。
assertfalse((user & mask) == mask);总结在本教程中,我们学习了如何使用位运算符来创建位掩码,并应用它们来从整数中提取二进制信息。

基于555定时器的D类耳机驱动器电路设计
华硕PA148CTV便携专业显示器亮相CES2021,强悍实力成创作者新宠
用电信息采集系统EPON建设方案
用插值查找表实现FPGA的DSP功能
为什么苹果要抛弃英特尔选择自研芯片?
如何使用位操作符实现低级别的位掩码
Python的C外部函数的静态类型推断
绿色能源电话充电器的制作
STM32 单片机开发中的 RTOS应用分析
【服务器数据恢复】IBM服务器5盘raid5数据恢复案例
乐视汽车获41亿投资,来源既是贾跃亭同学
泛在电力物联网是我国能源安全新战略的需要
英国MBDA公布新型作战概念无人机 “幽灵”
国内首个完成运营商入库的国产芯Cat 1模组
荣耀V40系列三款型号公布
即将发布!iQOO Neo 5部分配置信息曝光
5G已经给中国社会带来了重大变化
光纤传感器的原理_光纤传感器的特征
全球首个 中国广电700MHz大带宽成为5G国际标准
浪潮联合Xilinx推出业界首款集成HBM2的FPGA