什么(0 << 12)在Swift中意味着什么?

new*_*fig 6 bit-shift swift

在文档中,我发现枚举案例定义为:

kCGBitmapByteOrderDefault = (0 << 12)
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着位移零12次......仍为零.我错过了什么?

Rob*_*Rob 6

如果查看所有相关值,您会看到:

kCGBitmapByteOrderMask     = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault  = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big    = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big    = kCGImageByteOrder32Big
Run Code Online (Sandbox Code Playgroud)

并且kCGBitmapByteOrderMask0x7000(即移位12位后的三位; 0b0111000000000000).

因此,0 << 12这只是一种非常明确的方式,即"在转换为12位后,位是否为0".是的,0 << 12实际上0,但它是明确的,kCGBitmapByteOrderDefault不是当整个CGBitmapInfo值为零时(因为在前12位中可能存在其他有意义的非零数据),但仅当前12位之后的位为零时.

因此,简而言之,这<< 12在技​​术上并不是必需的,但使意图更加明确.


mc0*_*c01 1

根据Apple文档CGBitmapInfo

\n\n
\n

字节顺序常量指定像素格式的字节顺序。

\n\n

...如果代码编写不正确,\xe2\x80\x99s 可能会误读数据,从而导致颜色或 Alpha 显示错误。

\n
\n\n

的各种常量kCGBitmapByteOrder大多映射到 中类似命名的常量CGImageByteOrder,它没有“默认值”。

\n\n

这些值可以在文档中详细找到CGImageByteOrderInfo

\n\n

您询问的是默认值,正如您所指出的位移 0,它仍然是 0,但正如 Rob 指出的那样,前面/后面的位仍然很重要。

\n\n

您缺少的是其他选项:

\n\n

kCGBitmapByteOrder16Little = (1 << 12)\n16 位、小端格式。

\n\n

kCGBitmapByteOrder32Little = (2 << 12)\n32 位、小端格式。

\n\n

kCGBitmapByteOrder16Big = (3 << 12)\n16 位、大端格式。

\n\n

kCGBitmapByteOrder32Big = (4 << 12)\n32 位、大端格式。

\n\n

这些使用不同的值,具体取决于 16 位与 32 位图像,以及您是否首先关心最低有效数字或最高有效数字。

\n\n

“默认”(0 << 12)遵循相同的格式/过程,即移位 12 位。并且,正如 Rob 指出的那样,前 12 位和后面的任何位也有意义。使用这些其他选项与使用“默认”选项相比,它们的解释方式会产生不同的效果

\n