在关于JSON的PHP documentation上,它提到了bitmask这个词。维基百科将其定义为面具。我不了解位掩码或掩码或它们如何有用。有人可以用外行人的术语解释这些术语,而不是行话吗?
答案 0 :(得分:64)
位和字节
在计算中,数字在内部用二进制表示。这意味着,在对变量使用整数类型的情况下,这实际上将在内部表示为0和1的总和。
您可能知道,一位代表一个0
或一个1
。这些位中的八个的串联表示字节,例如字节。 00000101
,即5号。
我假设您知道数字是如何用二进制表示的,如果没有,请看一下here。
在PHP中,一个数字(大部分)长4个字节。这意味着您的号码实际上使用了32位的内部存储空间。但出于简单的原因,在整个答案中我将使用8位数字。
以状态存储状态
现在假设您要创建一个包含状态的程序,该状态基于多个值(true
)或零(false
)。可以将这些值存储在不同的变量中,可以是布尔值或整数。 或者使用单个整数变量并使用其内部32位的每个位来表示不同的真实和谬误。
一个例子:
00000101
。这里第一位(从右到左读)是真的,它代表第一个变量。第二个是false,表示第二个变量。第三个是真的。等等...
这是一种非常紧凑的数据存储方式,有很多用法。
位屏蔽
这就是比特掩蔽的地方。这听起来很复杂但实际上它非常简单。
位掩码允许您使用在位级上工作的操作。
你实际上将一个掩码应用于一个值,在我们的例子中,值是我们的状态00000101
,掩码也是一个二进制数,表示感兴趣的位。 / p>
通过对掩码和状态执行二进制操作,可以实现以下目的:
如果我们想要将特定值设置为true,我们可以通过使用OR运算符和以下位掩码来执行此操作:
Mask: 10000000b
Value: 00000101b
---- OR ---------
Result: 10000101b
或者可以使用AND运算符从状态中选择特定值:
Mask: 00000100b
Value: 00000101b
---- AND ---------
Result: 00000100b
我建议你深入研究一下并熟悉一下行话。一个好的开始可能是this链接。
古德勒克!
答案 1 :(得分:11)
它只是一个数字,用二进制表示。例如,我想说我要存储8个布尔值(true
或false
)。我可以将它存储为8个布尔值的数组,或者我可以将其存储为单个字节(8位),每个字节存储一个布尔值(0
= false
,{{1} } = 1
)。
此时,我可以轻松地操作我的字节,以便我可以(1)将特定位设置为打开或关闭(真或假),以及(2)检查特定位是打开还是关闭。
true
mask = mask | (1 << bitIndex)
mask = mask & ~(1 << bitIndex)
所有这些操作都使用左移运算符,它将位从最不重要位置移动到最重要位置。
答案 2 :(得分:3)
本质上,Bitmask是一个布尔标志列表(例如isAlive,isMoving等)压缩成单个字段,通常是整数。它可以减少相当大量的JSON字符串大小或内存占用量。
这可能很重要,特别是在PHP中,数组中的单个布尔值可以占用相同数量的RAM作为整数。有一个very simple Bitmask guide会逐步解释您需要知道的一切,包括如何以及何时使用它。