【问题标题】:What is the significance/function of bit shifting and the bitwise and operator in finding pixel colors?移位和按位和运算符在查找像素颜色中的意义/功能是什么?
【发布时间】:2021-04-02 03:44:38
【问题描述】:

我在试图弄清楚如何获取特定像素的颜色时遇到了以下代码:

fn findRed(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 16) & 255)
}

fn findGreen(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 8) & 255)
}

fn findBlue(pointer: UInt32) (UInt8) {
    return UInt8((pixelData >> 0) & 255)
}

我知道在 RGB 世界中,RGB 中的每种颜色都是在 0 到 255 的范围内测量的,但是这里的位和运算符 (& 255) 对此有何作用?

更进一步,在这种情况下移位是做什么的?为什么它会移动 8 的倍数?需要明确的是,这是处理 8 位彩色图像,但我似乎无法弄清楚它是如何完成“查找”的

【问题讨论】:

  • 这是从 4 字节的 uint32 中提取单个字节,尽管代码看起来不像 C。
  • 2550xff。也就是说,它设置了所有低 8 位。当用作掩码时,它只提取低 8 位,所有高位被屏蔽为 0。这正是您提取单个 8 位 RGB 分量值所需的内容。

标签: c pointers colors pixel


【解决方案1】:

这些函数将表示为 RGB = 256² R + 256 G + B 的 32 位 UInt32 颜色解压缩为单独的 8 位组件 R = (RGB / 256²) % 256G = (RGB / 256) % 256B = RGB % 256

位操作利用了以下事实:对于两个N = 2ⁿ 的幂,以下等效于无符号整数:

  • a << na * 2ⁿ

  • a >> na / 2ⁿ 其中/ 是整数除法= floor(a / 2ⁿ)

  • a & (2ⁿ - 1)a % 2ⁿ 其中% 是除法的余数,也就是模运算符

对于n = 82ⁿ = 256 例如(RGB >> 8) & 255 == (RGB / 256) % 256 == G

【讨论】:

    【解决方案2】:

    使用 8 位,您可以覆盖 [0..255] 的范围。

    十进制:255
    十六进制:0xFF(或只是FF)
    二进制:11 11 11 11

    封装在 UInt32 中的像素 (RGB) 如下所示:0x00RRGGBB

    如果你想提取单个组件,你必须移动位并将其屏蔽掉。

    面具

    0x000000FF (binary: 00000000 00000000 00000000 11111111)
    

    蓝色

    0x00RRGGBB & Mask => 0x000000BB
    

    绿色:我们必须向右移动 8 位(1 个字节)

    (0x00RRGGBB >> 8) & Mask => 0x0000RRGG & Mask => 0x000000GG
    

    红色:我们必须向右移动 16 位(2 个字节)

    (0x00RRGGBB >> 16) & Mask => 0x000000RR & Mask => 0x000000RR 
    

    关于位运算符的 wiki 页面可能感兴趣:Bitwise operation - AND

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2014-07-23
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多