在文档中,我发现枚举案例定义为:
kCGBitmapByteOrderDefault = (0 << 12)
据我所知,这意味着位移零12次......仍为零。我错过了什么?
答案 0 :(得分:6)
如果查看所有相关值,您会看到:
kCGBitmapByteOrderMask = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big = kCGImageByteOrder32Big
kCGBitmapByteOrderMask
为0x7000
(即移位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
将产生相同的值;因此它只适用于文档。