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
  • 用000000000 1111111 2屏蔽数字,即0x7F:
    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
    从何而来,a
    uint64\u t
    ?@FelixPalmen这样我已经试过了,结果是不可能。风向标yes@MartinWalzl然后只使用无符号类型。OP的
    0x88290000d
    可能很容易不适合
    unsigned int reg=0x88290000d