按位标志

**位标志**是一组变量,通常是简单的数值,可用于启用或禁用方法或其他代码结构的特定用法或功能。它们可以快速有效地做到这一点,因为它们在位级别进行操作。同一组中的相关标志通常被赋予互补的值,表示单个值(例如十六进制)中的不同位位置,以便可以使用单个值表示多个标志设置。

例如,在WebGPU API中,使用GPUDevice.createBuffer()方法创建GPUBuffer对象实例。调用此方法时,您在描述符中定义一个usage属性,其中包含一个或多个标志,以启用该缓冲区的不同允许用法。

js
usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE;

这些值定义在同一个命名空间中,并且每个值都有一个十六进制值。

使用标志 十六进制表示 十进制等价物
GPUBufferUsage.MAP_READ 0x0001 1
GPUBufferUsage.MAP_WRITE 0x0002 2
GPUBufferUsage.COPY_SRC 0x0004 4
GPUBufferUsage.COPY_DST 0x0008 8
GPUBufferUsage.INDEX 0x0010 16
GPUBufferUsage.VERTEX 0x0020 32
GPUBufferUsage.UNIFORM 0x0040 64
GPUBufferUsage.STORAGE 0x0080 128
GPUBufferUsage.INDIRECT 0x0100 256
GPUBufferUsage.QUERY_RESOLVE 0x0200 512

当您查询GPUBuffer.usage属性时,您将获得一个返回的十进制数字,它是不同使用标志的不同十进制值的总和。回到上面的示例,查询前面指定的用法创建的GPUBufferGPUBuffer.usage将返回以下内容:

  • GPUBufferUsage.COPY_SRC的十进制等价物,4
  • 加上GPUBufferUsage.MAP_WRITE的十进制等价物,2
  • 等于 6。

由于为不同的标志选择了值,因此每种值的组合都是唯一的,因此程序可以一目了然地从单个值中分辨出哪些标志已设置。此外,您可以使用按位与运算符轻松测试组合值中设置了哪些标志。

js
if (buffer.usage & GPUBufferUsage.MAP_WRITE) {
  // Buffer has MAP_WRITE usage
}

另请参阅