【随手写写】重铸编程之魂笔记01

这是我从C**N平台换到博客园的第一篇文章
本系列随笔记录我学习B站UP主CodingSoul的重铸编程之魂课程
一直在写计算机视觉等代码,写了这么多代码,从来没好好研究过底层原理,实在是难绷

  1. 题目:变量的运算实战

  2. 使用变量的思维方式

    • 不要受限于数据类型
    • 准确考虑每个元素所要使用的内存空间
    • 将目光聚焦于位级别

  1. 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

posted @ 2025-04-22 20:03  秦瑞迁  阅读(271)  评论(0)    收藏  举报