什么是位掩码和掩码?

时间:2015-07-22 23:24:24

标签: bitmask

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

3 个答案:

答案 0 :(得分:64)

位和字节

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

您可能知道,一位代表一个0或一个1。这些位中的八个的串联表示字节,例如字节。 00000101,即5号。 我假设您知道数字是如何用二进制表示的,如果没有,请看一下here

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

以状态存储状态

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

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

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

位屏蔽

这就是比特掩蔽的地方。这听起来很复杂但实际上它非常简单。

位掩码允许您使用在位级上工作的操作。

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

你实际上将一个掩码应用于一个值,在我们的例子中,值是我们的状态00000101,掩码也是一个二进制数,表示感兴趣的位。 / p>

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

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

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

Mask:   10000000b
Value:  00000101b
---- OR ---------
Result: 10000101b

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

Mask:   00000100b
Value:  00000101b
---- AND ---------
Result: 00000100b

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

古德勒克!

答案 1 :(得分:11)

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

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

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

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

答案 2 :(得分:3)

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

这可能很重要,特别是在PHP中,数组中的单个布尔值可以占用相同数量的RAM作为整数。有一个very simple Bitmask guide会逐步解释您需要知道的一切,包括如何以及何时使用它。