编写一个使用指针和位运算符来改变内存中一位的C函数?

Bob*_*ski 6 c byte pointers bit-manipulation

首先,这是我需要解决的问题的确切措辞:


BIOS(基本输入输出服务)控制计算机上的低级I/O. 当计算机首次启动时,系统BIOS会创建一个从内存地址0x400开始供自己使用的数据区.地址0x0417是键盘移位标志寄存器,该字节的位具有以下含义:

Bit Value Meaning
7    0/1  Insert off/on
6    0/1  CapsLock off/on
5    0/1  NumLock off/on
4    0/1  ScrollLock off/on
3    0/1  Alt key up/down
2    0/1  Control key up/down
1    0/1  Left shift key up/down
0    0/1  Right shift key up/down
Run Code Online (Sandbox Code Playgroud)

该字节既可以写入也可以读取.因此,我们可以通过设置或清除相关位来更改键盘上CapsLock,NumLock和ScrollLock LED的状态.使用指针和位运算符编写C函数以打开大写锁定而不更改其他位.


我们的老师根本没有对此进行过调查,我参考了教科书并进行了许多Google搜索以寻求帮助.

我理解按位运算符是如何工作的,并且理解解决方案是将此字节与二进制值'00000010'进行或运算.但是,在实现这个问题时我很困惑.我如何用C代码写这个?我不知道如何声明一个指向1字节内存的指针.除此之外,我假设答案看起来如下(用byte适当的东西代替):

byte* b_ptr = 0x417;
(*b_ptr) |= 00000010;
Run Code Online (Sandbox Code Playgroud)

以上解决方案是否正确?

Gor*_*don 6

unsigned char是byte的典型同义词.您可以键入def byte表示如果它不可用.

您使用的符号是十进制的.二进制数的表示法在十六进制中最简单,所以我只使用0x02而不是00000010,这实际上是文字数字的八进制表示法.

我认为你已经颠倒了比特的顺序.我的猜测是位数最多 - 最不重要,所以在你提出的解决方案中,位掩码00000010是左移.

否则,假设byte是typedef unsigned char,byte * b_ptr = 0x417;则会将语法指向内存地址0x417,这就是你想要的.