c - 移位和按位和运算符在查找像素颜色中的意义/功能是什么?
问题描述
在试图弄清楚如何获取特定像素的颜色时,我遇到了以下代码:
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 位彩色图像,但我似乎无法弄清楚它是如何完成“查找”的
解决方案
使用 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 页面可能很有趣:按位运算 - AND
推荐阅读
- java - 在 Spring Boot 应用程序中处理接口的具体实现中的重复代码
- plantuml - plantUML 语法中的嵌套 alt
- docker - 如何处理更改 docker compose 容器的 ips?
- reactjs - 在反应中使用 ag-grid
- bash - printf 以错误的顺序打印我的变量
- vb.net - vb .net 通过类传递对象/变量
- python - Python 将 yyyy-mm-dd 转换为 dd/mm/yyyy 但仍将列保留为 Excel 中的日期类型
- php - 我不明白为什么这个 php 函数不起作用
- css - 如何在 Safari 和 Safari 移动设备上使用 Bootstrap 4 设置高度?
- c++ - C ++:从向量的任何地方获取int