【随手写写】重铸编程之魂笔记01
这是我从C**N平台换到博客园的第一篇文章
本系列随笔记录我学习B站UP主CodingSoul的重铸编程之魂课程
一直在写计算机视觉等代码,写了这么多代码,从来没好好研究过底层原理,实在是难绷
-
题目:变量的运算实战
-
使用变量的思维方式
- 不要受限于数据类型
- 准确考虑每个元素所要使用的内存空间
- 将目光聚焦于位级别
- RGBA(256)颜色转换
31 15 0
+---+---+---+---+---+---+---+---+
| R | G | B | A |
+---+---+---+---+---+---+---+---+
我用C语言实现的版本:
#include<stdio.h>
//用于判断是否OK的标志
#define CVT_ERROR 1
#define CVT_OK 0
//定义一个存储RGB图像像素点信息的结构体
typedef struct RGBA
{
//用char是因为char占一个字节
//RGB颜色的每一个通道都是0-255的范围
//255的二进制是1111 1111,恰好一个字节就能存得下
//要用无符号字符,0-255,而不是有符号字符(-128-127)
//下面测试用例中的0x80的10进制是128
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
}RGBA;
//获取颜色函数声明
int get_color(int color, RGBA* rgba);
//输出颜色数据函数声明
void print_color_info(RGBA* rgba);
//获取颜色函数
//R G B A
//0x45 80 32 40
int get_color(int color, RGBA* rgba){
//rgba是空结构体指针直接返回
if(rgba == NULL){
return CVT_ERROR;
}
rgba->r = ((color & 0xFF000000) >> 24); //颜色和11111111 00000000 00000000 00000000
//作与运算,这样就把高位留在了对应变量的高位中(1与1是1,其余都是0,
//右移动24位,是将R留在最低位中,这样方便rgba中的char(一个字节)去接收最低位的一个字节的数据
rgba->g = ((color & 0x00FF0000) >> 16); //一个字节是8位二进制,所以这里移动16就移动到最低位那个字节上了
rgba->b = ((color & 0x0000FF00) >> 8);
rgba->a = (color & 0x000000FF); //这里作与运算直接就留在最低为了
return CVT_OK;
}
//输出颜色信息函数
void print_color_info(RGBA* rgba){
printf("颜色信息为:\n");
printf("R:%u\n", rgba->r);
printf("G:%u\n", rgba->g);
printf("B:%u\n", rgba->b);
printf("A:%u\n", rgba->a);
}
int main(){
int color = 0x45803240;
RGBA rgba;
get_color(color, &rgba);
print_color_info(&rgba);
return 0;
}
输出结果:
颜色信息为:
R:69
G:128
B:50
A:64
浙公网安备 33010602011771号