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

时间:2017-11-08 22:31:37

标签: swift bit-shift

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

kCGBitmapByteOrderDefault = (0 << 12)

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

3 个答案:

答案 0 :(得分:6)

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

kCGBitmapByteOrderMask     = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault  = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big    = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big    = kCGImageByteOrder32Big

kCGBitmapByteOrderMask0x7000(即移位12位后的三位; 0b0111000000000000)。

所以0 << 12只是一种非常明确的说法&#34;如果在移位12位之后这些位是0和#34;。是的,0 << 12实际上是0,但它明确指出kCGBitmapByteOrderDefault不是整个CGBitmapInfo值为零时(因为可能还有其他意义) ,前12位中的数据非零,但仅当前12位之后的位为零时才会出现。

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

答案 1 :(得分:1)

CGBitmapInfo的每Apple Doc条:

  

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

     

...如果代码编写不正确,可能会误读导致颜色或alpha出现错误的数据。

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

这些值详见in the docs for CGImageByteOrderInfo

你问过的那个是默认值,正如你所注意到的那样,位移0仍为0,但正如Rob所说,前面/后面的位仍然很重要。

您缺少的是其他选项:

kCGBitmapByteOrder16Little = (1 << 12) 16位,小端格式。

kCGBitmapByteOrder32Little = (2 << 12) 32位小端格式。

kCGBitmapByteOrder16Big = (3 << 12) 16位大端格式。

kCGBitmapByteOrder32Big = (4 << 12) 32位,大端格式。

这些值使用不同的值,具体取决于16位与32位图像,以及您是否首先关注最小或最重要的数字。

“默认”(0 << 12)遵循相同的格式/过程12,并且,正如Rob指出的那样,前12位以及任何后续内容也有意义。使用这些其他选项对它们的解释方式与使用“默认”

的方式有不同的影响

答案 2 :(得分:0)

这样的构造意味着占位符或不再支持的功能的文档。这意味着在求和中包含值kCGBitmapByteOrderDefault将产生相同的值;因此它只适用于文档。