gpt4 book ai didi

c - 使用按位运算符从各个字节形成多字节值

转载 作者:行者123 更新时间:2023-11-30 15:44:25 26 4
gpt4 key购买 nike

VGA 显示器编程涉及将 16 位值写入某些内存位置,以便在屏幕上打印字符。这就是 16 位值中的不同位如何转换为屏幕上打印的字符的方式:

enter image description here

我使用枚举来表示不同的背景/前景色:

typedef enum
{
eBlack ,
eBlue ,
eGreen ,
eCyan,
eRed,
eMagenta,
eBrown,
eLightGrey,
eDarkGrey,
eLightBlue,
eLightGreen,
eLightCyan,
eLightRed,
eLightMagenta,
eLightBrown,
eWhite

} textColor ;

我编写这个函数是为了根据三件事创建这个 16 位值:用户想要打印的字符、他想要的前景色和背景色:

假设:在我的平台上,int 32 位,unsigned Short 16 位,char 8 位

void printCharacterOnScreen ( char c , textColor bgColor, textColor fgColor ) 
{
unsigned char higherByte = ( bgColor << 4 ) | (fgColor ) ;
unsigned char lowerByte = c ;

unsigned short higherByteAs16bitValue = higherByte & 0 ;
higherByteAs16bitValue = higherByteAs16bitValue << 8 ;

unsigned short lowerByteAs16bitValue = lowerByte & 0 ;

unsigned short complete16bitValue = higherByteAs16bitValue & lowerByteAs16bitValue ;

// Then write this value at the special address for VGA devices.
}

代码正确吗?它是创建这样的值的写入方式吗?有没有一些标准的方法来进行这种操作?

我的方法是否独立于平台?对代码还有其他评论吗?

最佳答案

非常接近 - 但线路

unsigned short lowerByteAs16bitValue = lowerByte & 0 ;

将清除低字节。您可能想要

unsigned short lowerByteAs16bitValue = lowerByte;

您实际上并不需要 lowerByte,并且可以直接使用 c - 但您的代码更具可读性。

下一个问题:

unsigned short complete16bitValue = higherByteAs16bitValue & lowerByteAs16bitValue ;

再次,您正在使用 & 运算符。我认为您的意思是使用 | (或),就像您之前所做的几行一样。

虽然现在看起来“可移植”,但在写入硬件时仍然需要小心,因为低端和高端平台可能会交换字节 - 因此,当您的代码运行到返回正确的点时16 位字,您可能需要注意该字如何写入 VGA 卡。这是您注释掉的一行...但这非常重要!

关于c - 使用按位运算符从各个字节形成多字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com