在关于JSON 的PHP 文档中,它提到了bitmask这个词.维基百科将其定义为面具.我不了解位掩码或掩码或它们如何有用.有人可以用外行的条款解释这些术语而不用行话吗?
DJa*_*ens 69
比特和字节
在计算中,数字在内部用二进制表示.这意味着,在对变量使用整数类型的情况下,这实际上将在内部表示为0和1的总和.
您可能知道,单个位代表一个0
或一个1
.这些位中的八个的串联表示字节,例如00000101
,其为数字5.我假设您知道数字如何以二进制表示,如果不是,请查看此处.
在PHP中,一个数字(大部分)长4个字节.这意味着您的号码实际上使用了32位的内部存储空间.但出于简单的原因,在整个答案中我将使用8位数字.
以位为单位存储状态
现在假设您要创建一个包含状态的程序,该状态基于多个值(一(true
)或零(false
).可以将这些值存储在不同的变量中,可以是布尔值或整数.或者使用单个整数变量并使用其内部32位的每个位来表示不同的真和假.
一个例子:
00000101
.这里第一位(从右到左读)是真的,它代表第一个变量.第二个是false,表示第二个变量.第三个是真的.等等...
这是一种非常紧凑的数据存储方式,具有很多用途.
位屏蔽
这就是位掩码的用武之地.这听起来很复杂,但实际上它非常简单.
位屏蔽允许您使用在位级上工作的操作.
您实际上将掩码应用于值,在我们的示例中,值是我们的状态00000101
,掩码也是二进制数,表示感兴趣的位.
通过对掩码和状态执行二进制操作,可以实现以下目的:
如果我们想要将特定值设置为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个布尔值(true
或false
)我想要存储.我可以将它存储为8个布尔值的数组,或者我可以将其存储为单个字节(8位),每个字节存储一个布尔值(0
= false
,1
= true
).
此时,我可以轻松地操作我的字节,以便我可以(1)将特定位设置为打开或关闭(真或假),以及(2)检查特定位是打开还是关闭.
mask = mask | (1 << bitIndex)
mask = mask & ~(1 << bitIndex)
(mask & (1 << bitIndex)) != 0
所有这些操作都使用左移运算符,它将位从最不重要位置移动到最重要位置.
本质上,Bitmask是布尔标志(例如isAlive,isMoving等)的列表,这些布尔标志被压缩为单个字段(通常为整数)。它可以减少大量的JSON字符串大小或内存占用。
这在PHP中尤其重要,在PHP中,数组中的单个布尔值可以占用与整数相同的RAM。有一个非常简单的位掩码指南,它将逐步解释您需要了解的所有内容,包括如何以及何时使用它。