什么是位掩码和掩码?

Rob*_*cha 32 bitmask

在关于JSON 的PHP 文档中,它提到了bitmask这个词.维基百科将其定义为面具.我不了解位掩码或掩码或它们如何有用.有人可以用外行的条款解释这些术语而不用行话吗?

DJa*_*ens 69

比特和字节

在计算中,数字在内部用二进制表示.这意味着,在对变量使用整数类型的情况下,这实际上将在内部表示为0和1的总和.

您可能知道,单个位代表一个0或一个1.这些位中的八个的串联表示字节,例如00000101,其为数字5.我假设您知道数字如何以二进制表示,如果不是,请查看此处.

在PHP中,一个数字(大部分)长4个字节.这意味着您的号码实际上使用了32位的内部存储空间.但出于简单的原因,在整个答案中我将使用8位数字.

以位为单位存储状态

现在假设您要创建一个包含状态的程序,该状态基于多个值(一(true)或零(false).可以将这些值存储在不同的变量中,可以是布尔值或整数.或者使用单个整数变量并使用其内部32位的每个位来表示不同的真和假.

一个例子: 00000101.这里第一位(从右到左读)是真的,它代表第一个变量.第二个是false,表示第二个变量.第三个是真的.等等...

这是一种非常紧凑的数据存储方式,具有很多用途.

位屏蔽

这就是位掩码的用武之地.这听起来很复杂,但实际上它非常简单.

位屏蔽允许您使用在位级上工作的操作.

  • 编辑一个字节中的特定位
  • 检查是否存在特定位值.

您实际上将掩码应用于值,在我们的示例中,值是我们的状态00000101,掩码也是二进制数,表示感兴趣的位.

通过对掩码和状态执行二进制操作,可以实现以下目的:

  • AND运算符提取状态中的位的子集
  • OR运算符设置状态中的位的子集
  • XOR运算符切换状态中的一部分位

如果我们想要将特定值设置为true,我们可以通过使用OR运算符和以下位掩码来执行此操作:

Mask:   10000000b
Value:  00000101b
---- OR ---------
Result: 10000101b
Run Code Online (Sandbox Code Playgroud)

或者可以使用AND运算符从状态中选择特定值:

Mask:   00000100b
Value:  00000101b
---- AND ---------
Result: 00000100b
Run Code Online (Sandbox Code Playgroud)

我建议你深入研究一下并熟悉一下行话.一个好的开始可能是这个链接.

祝好运!


Jas*_*zun 13

它只是一个数字,用二进制表示.例如,假设我有8个布尔值(truefalse)我想要存储.我可以将它存储为8个布尔值的数组,或者我可以将其存储为单个字节(8位),每个字节存储一个布尔值(0= false,1= true).

此时,我可以轻松地操作我的字节,以便我可以(1)将特定位设置为打开或关闭(真或假),以及(2)检查特定位是打开还是关闭.

  • 要将位设置为1: mask = mask | (1 << bitIndex)
  • 要将位设置为0: mask = mask & ~(1 << bitIndex)
  • 得到一点(能够检查): (mask & (1 << bitIndex)) != 0

所有这些操作都使用左移运算符,它将位从最不重要位置移动到最重要位置.


Ast*_*rus 5

本质上,Bitmask是布尔标志(例如isAlive,isMoving等)的列表,这些布尔标志被压缩为单个字段(通常为整数)。它可以减少大量的JSON字符串大小或内存占用。

这在PHP中尤其重要,在PHP中,数组中的单个布尔值可以占用与整数相同的RAM。有一个非常简单的位掩码指南,它将逐步解释您需要了解的所有内容,包括如何以及何时使用它。