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)
以上解决方案是否正确?
unsigned char是byte的典型同义词.您可以键入def byte表示如果它不可用.
您使用的符号是十进制的.二进制数的表示法在十六进制中最简单,所以我只使用0x02而不是00000010,这实际上是文字数字的八进制表示法.
我认为你已经颠倒了比特的顺序.我的猜测是位数最多 - 最不重要,所以在你提出的解决方案中,位掩码00000010是左移.
否则,假设byte是typedef unsigned char,byte * b_ptr = 0x417;则会将语法指向内存地址0x417,这就是你想要的.