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