Binary 如何从32位数字中提取位

Binary 如何从32位数字中提取位,binary,hex,extract,bits,Binary,Hex,Extract,Bits,我不太懂C语言,我有一个问题,因为我的一个同事正在休假 我有一个32位的数字,我必须从中提取位。我确实读了一些文章,但我仍然不清楚怎么做。如果有人能帮助我,我将不胜感激 下面是我需要做的一个例子: 假设十六进制数=0xD7448EAB。 二进制=11010111 0100 0100 1000 1110 1010 1011 我需要提取16位,然后输出那个值。我要第10位到第25位 低10位(十进制)被忽略。i、 例如,10 1010 1011被忽略。 和高6位(溢出)被忽略。i、 例如,11010

我不太懂C语言,我有一个问题,因为我的一个同事正在休假

我有一个32位的数字,我必须从中提取位。我确实读了一些文章,但我仍然不清楚怎么做。如果有人能帮助我,我将不胜感激

下面是我需要做的一个例子:

假设十六进制数=0xD7448EAB。 二进制=11010111 0100 0100 1000 1110 1010 1011 我需要提取16位,然后输出那个值。我要第10位到第25位

低10位(十进制)被忽略。i、 例如,10 1010 1011被忽略。
和高6位(溢出)被忽略。i、 例如,110101被忽略

剩余的16位数据需要输出为11 0100 0100 1000(需要斜体数字作为输出)

这是一个例子,但我会一直得到不同的十六进制数,我需要提取我所解释的相同位

我如何解决这个问题

多谢各位

对于本例,您将输出1101 0001 0010 0011,即0xD123或53539十进制

我要第10位到第25位

您可以这样做:

unsigned int number = 0xD7448EAB;
unsigned int value = (number & 0x3FFFC00) >> 10;
或者这个:

unsigned int number = 0xD7448EAB;
unsigned int value = (number >> 10) & 0xFFFF;

好的,我是这样写的:

#include <stdint.h>
#include <stdio.h>

main() {
    uint32_t in = 0xd7448eab;
    uint16_t out = 0;

    out = in >> 10; // Shift right 10 bits
    out &= 0xffff;  // Only lower 16 bits
    printf("%x\n",out);
}
#包括
#包括
main(){
uint32_t in=0xd7448eab;
uint16\u t out=0;
out=in>>10;//右移10位
out&=0xffff;//仅低16位
printf(“%x\n”,out);
}
>>10中的
将数字右移10位;
&0xffff
丢弃除较低16位之外的所有位。

您需要掩码才能获得所需位。掩码是一种数字,您可以使用它以您想要的方式筛选位(保留位、删除/清除位、修改数字等)。您需要知道的是AND、OR、XOR、NOT和移位操作。对于你需要的,你只需要一对


你知道移位:
x我结合上面的两个答案编写了一个C程序,它可以从32位无符号整数的任何一个位范围(不仅仅是10到25)中提取位。该函数的工作方式是将
num
的位
lo
返回到
hi
(含)中

#include <stdio.h>
#include <stdint.h>

unsigned extract(unsigned num, unsigned hi, unsigned lo) {
    uint32_t range = (hi - lo + 1);  //number of bits to be extracted
    //shifting a number by the number of bits it has produces inconsistent 
    //results across machines so we need a special case for extract(num, 31, 0)
    if(range == 32)
        return num;
    uint32_t result = 0;
    //following the rule above, ((1 << x) - 1) << y) makes the mask:
    uint32_t mask = ((1 << range) -1) << lo;
    //AND num and mask to get only the bits in our range
    result = num & mask;
    result = result >> lo; //gets rid of trailing 0s
    return result;
}
int main() {
    unsigned int num = 0xd7448eab;
    printf("0x%x\n", extract(num, 10, 25));
}
#包括
#包括
无符号提取(无符号num、无符号hi、无符号lo){
uint32_t range=(hi-lo+1);//要提取的位数
//将一个数字按其位数移位会产生不一致的结果
//跨机器的结果,因此我们需要提取的特殊情况(num,31,0)
如果(范围==32)
返回num;
uint32_t结果=0;

//按照上述规则,((1)您是否需要将所有内容保持为二进制形式?或者您是否能够将十六进制值转换为二进制,然后将二进制值转换为字符串。然后,您可以只获取感兴趣的子字符串,并根据需要将其转换回二进制/十六进制。和(&运算符)你的值带有你感兴趣的位集的掩码,然后右移结果(>>运算符)以将它们与位零对齐。嗨,webuster,我发现你的值有点容易理解,所以我尝试计算值,但它似乎输出了错误的结果。我在十六进制模式下使用了程序员计算器。1(1)我也这样做了,结果是一样的(1)你犯了同样的错误,以16为底的Lsh ing和Rsh ing不是十进制的。以10为十六进制的Lsh ing意味着以16为单位移位。十进制10的十六进制数字是A。所以你应该移位的方式是FFFF,这可能是个愚蠢的问题,但说到C,我真的是个傻瓜。我可以用这个表达式-((1无符号整数=0xD7448EAB;无符号整数=0x3FFFC00)>>10;这是绝对正确的。唯一需要的更改是>>8,而不是>>10。我已经成功了。感谢您使用
>10
符合您的要求。使用
>8
会得到第8位到第23位,而这不是您要求的。为什么分别使用
=
&=
而不是使用
=
&
在同一句话中?对于C初学者来说更简单(它让我评论每一个变化),而且
&
有先例问题(这会让不懂C的人感到困惑),您如何调整此解决方案来提取未知范围的位?比如函数
提取(unsigned num,unsigned hi,unsigned lo)
返回
num
hi
lo
范围内的位?