如何从C语言中的数字中提取位?

如何从C语言中的数字中提取位?,c,C,我需要在C中提取短数据类型的特定部分(位数) 例如,我有一个二进制文件45作为101101,我只希望中间有2位,比如(10) 我两天前开始使用C代码,所以没有给出很多函数 如何提取它们?请搜索按位操作以获取更多一般信息,并搜索位掩蔽以获取特定问题。如果你是编程新手,我不建议你跳到bits 根据输入的长度是否固定,解决方案将略有变化。如果无法修复,您需要相应地安排您的面具。或者你可以使用另一种方法,这可能是最简单的方法 为了获得所需的特定位,可以使用位屏蔽 例如,您有101101并且您想要中间的两

我需要在C中提取短数据类型的特定部分(位数)

例如,我有一个二进制文件45作为101101,我只希望中间有2位,比如(10

我两天前开始使用C代码,所以没有给出很多函数


如何提取它们?

请搜索按位操作以获取更多一般信息,并搜索位掩蔽以获取特定问题。如果你是编程新手,我不建议你跳到bits

根据输入的长度是否固定,解决方案将略有变化。如果无法修复,您需要相应地安排您的面具。或者你可以使用另一种方法,这可能是最简单的方法

为了获得所需的特定位,可以使用位屏蔽

例如,您有
101101
并且您想要中间的两个位,如果您
&
使用
001100
,则只有掩码上
1
的位在源代码中保持不变,所有其他位将设置为
0
。实际上,你会得到你感兴趣的东西

如果您不知道什么是
&(按位and)
,则它需要两个操作数,仅当第一个和第二个操作数为1时才返回1,否则返回0

输入:10101

掩码:0 0 1 1 0 0


结果:0 0 1 1 0 0

按照C语法,我们可以这样做:

unsigned int input = 45;

unsigned int mask = 0b001100; // I don't know if this is standard notation. May not work with all compilers
// or
unsigned int mask = 12; // This is equivalent

unsigned int result = input & mask; // result contains ...001100
正如你所看到的,我们过滤了我们想要的信息。下一步取决于您想对这些字节做什么

此时,结果
001100
对应于12。我想这不是很有用。你所能做的是,你可以移动这些碎片。为了去掉右边的
0
s,我们可以shitit右边2位。为此,我们需要使用
>
运算符

0 0 1 1 0>>2≡ 0 0 1 1

result = result >> 2; // result contains ...011
从那里,您可以设置一个bool变量来存储
1
0

unsigned char flag1 = result & 0b01; // or just 1
unsigned char flag2 = result & 0b10; // or just 2

您可以在不移位的情况下执行此操作,但这样更清晰。

您需要屏蔽要提取的位。如果您想创建设置了前4位的掩码。然后,您可以使用:
(1即使数字大于六位,您是否始终希望中间位,还是始终希望第三位和第四位从右向左计数?左/右位移位运算符(
)和按位“and”(
&
)在提取位时是您的朋友。请查看C语言文档中的那些。例如,要从数字的“中间”中提取
10
,您可以执行
(x>>1)和0x3
。要获取最左边的
10
,您可以执行
(x>>4)和0x3
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void print_bin(short n)
{
    unsigned long i = CHAR_BIT * sizeof(n);
    while(i--)
        putchar('0' + ((n >> i) & 1));

    printf("\n");
}


int main()
{
        short num = 45; /* Binary 101101 */

        short mask = 4; /* 4 bits */
        short start = 0; /* Start from leftmost bit 
                                position 0 */

        print_bin((num >> start) & ((1 << mask) - 1)); /* Prints 1101 */

        mask = 2; /* 2 bits */
        start = 1; /* start from bit indexed at position 1 */

        print_bin((num >> start) & ((1 << mask) - 1)); /* Prints 10 */

        return 0;
}
0000000000001101
0000000000000010