c - 在 C 中屏蔽和提取位

标签 c mask bitwise-operators bit-shift bitwise-and

我一直在查看有关掩码的帖子,但我仍然无法理解如何从 C 中的数字中提取某些位。

假设我们有一个整数, 0001 1010 0100 1011,它的十六进制表示是 0x1A4B,对吗?如果我想知道第 5 到第 7 个数字,在这种情况下是 101,我应该使用 int mask= 0x0000 1110 0000 0000, int extract = mask&number 吗?

此外,如何检查它是否为 101?我猜 == 不会在这里工作...

最佳答案

屏蔽是通过将除您想要的位以外的所有位设置为 0 来完成的。假设您有一个 8 位变量,并且您想要检查第 5 位是否为 1。假设您的变量是 00101100。为了屏蔽所有其他位,我们使用 & 运算符将除第 5 个之外的所有位设置为 0:

00101100 & 00010000

现在这对除第 5 位以外的每一位,右侧字节的位将为 0,因此 & 运算的结果将为 0。然而,对于第 5 位,来自右位是 1,所以结果将是左字节第 5 位的值 - 在本例中为 0:

现在要检查这个值,您必须将它与某些东西进行比较。为此,只需将结果与右侧的字节进行比较:

result = (00101100 & 00010000) == 00000000

为了概括这一点,您可以简单地通过左移 00000001 来从左侧字节中检索任何位,直到获得您想要的位。以下函数实现了这一点:

int getBit(char byte, int bitNum)
{
    return (byte & (0x1 << (bitNum - 1)))
}

这适用于任何大小的变量,无论是 8、16、32 还是 64(或任何其他与此相关的变量)。

关于c - 在 C 中屏蔽和提取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26359068/

相关文章:

c - 如何将整数数组内容复制到字符指针?

c - 如何确定 C 数组中的元素是否尚未分配给任何东西?

jquery - 输入掩码也应该接受五位数字

javascript - 部分屏蔽电子邮件地址 - javascript

javascript - 算法题 Decode Hex to set output

c - 如何将 const unsigned char* payLoad 转换为 char* 并复制它?

C 使用常量声明二维数组

iphone - 如何以编程方式为黑/白 UIImageView 着色?

c++ - 在 C++ 中将位序列转换为 uint32_t

带有奇数 '& 0x3' 按位运算符的 C++ 代码行