C 获取无符号整数中位的integervalue
我想写一个内核模块,它读取一个寄存器,(返回值保存在一个C 获取无符号整数中位的integervalue,c,C,我想写一个内核模块,它读取一个寄存器,(返回值保存在一个无符号int中),然后从这个变量中读取位16到22,并将其转换为整数。转换没有问题。但首先要解决的问题是如何将这些信息提取出来。 例如,我有两个十六进制值: 0x88290000d 0x005a0a00d 从这两个值中,我希望16到22位是整数,你知道我如何在内核模块中实现它吗 以下是如何提取第16位到第22位(包括7位): 将数字从寄存器读入unsigned int reg=… 将reg向右移动16位,因此位16至少是最低有效位置:re
无符号int
中),然后从这个变量中读取位16到22,并将其转换为整数。转换没有问题。但首先要解决的问题是如何将这些信息提取出来。
例如,我有两个十六进制值:
0x88290000d
0x005a0a00d
从这两个值中,我希望16到22位是整数,你知道我如何在内核模块中实现它吗 以下是如何提取第16位到第22位(包括7位):
unsigned int reg=…
reg
向右移动16位,因此位16至少是最低有效位置:reg>=16
reg&=0x7F
注意:以上从零开始计数位(传统的位编号方式)。您可以定义仅对7位(16位到22位)有效的掩码。因此,您的掩码将被定义为
mask=0x007F0000 //Your mask
var2=0x00270f00 //Variable which you want to mask
result=mask & var2 // bitwise-and operation to mask the value
result>>=16 // right shift the value to get only this value.
希望这有帮助:)开始吧。它应该有关于逐位运算符的章节或章节。假设您从最低有效位
0
开始对位进行编号,右移16位,并应用掩码过滤这些(现在最低的)7位((val>>16)&0x7fU
),九位值0x88290000d
从何而来,auint64\u t
?@FelixPalmen这样我已经试过了,结果是不可能。风向标yes@MartinWalzl然后只使用无符号类型。OP的0x88290000d
可能很容易不适合unsigned int reg=0x88290000d这个答案非常有效。但现在我有另一个问题,我用两个不同的值做了同样的两次,我把所有的东西都打印出来,然后工作。然后我删除了调试printk,值为0,再次放入后我得到了正确的值,你对此也有什么想法吗?@MartinWalzl当打印值改变程序的工作方式时,这意味着代码中存在未定义的行为。发布一个单独的问题,详细说明您做了什么以及如何打印值,或者运行您的代码(如果您的平台上有)。