为什么 VGA 颜色需要位移位?

Why is the bitwise shift needed for VGA colors?

我一直在关注 https://wiki.osdev.org/Bare_Bones 上的 Bare Bones 内核指南,但我不理解这些方法。有人可以解释为什么方法中的按位运算符是必要的吗?提前致谢!

enum vga_color {
    VGA_COLOR_BLACK = 0,
    VGA_COLOR_BLUE = 1,
    VGA_COLOR_GREEN = 2,
    VGA_COLOR_CYAN = 3,
    VGA_COLOR_RED = 4,
    VGA_COLOR_MAGENTA = 5,
    VGA_COLOR_BROWN = 6,
    VGA_COLOR_LIGHT_GREY = 7,
    VGA_COLOR_DARK_GREY = 8,
    VGA_COLOR_LIGHT_BLUE = 9,
    VGA_COLOR_LIGHT_GREEN = 10,
    VGA_COLOR_LIGHT_CYAN = 11,
    VGA_COLOR_LIGHT_RED = 12,
    VGA_COLOR_LIGHT_MAGENTA = 13,
    VGA_COLOR_LIGHT_BROWN = 14,
    VGA_COLOR_WHITE = 15,
};

static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) 
{
    return fg | bg << 4;
}

static inline uint16_t vga_entry(unsigned char uc, uint8_t color) 
{
    return (uint16_t) uc | (uint16_t) color << 8;
}

代码用于生成VGA Compatible Text Mode

枚举指定了一种颜色 table,它需要四位。第一个函数接受前景色和背景色,并对背景色进行位移,使两种颜色适合一个八位无符号整数。

第二个函数接受上面定义的八位 uint 并将其附加到一个八位字符以生成一个定义字母、背景颜色和前景色的 16 位值。

您似乎在使用每像素 4 位模型。因此,每个字节需要两个值。位狗屎将两个 4 位值放在一个 8 位字节中。