【问题标题】:Grabbing 'n' binary bits from end of unsigned int in C? Bit masking?从C中的无符号整数末尾抓取'n'二进制位?位掩蔽?
【发布时间】:2018-11-19 17:37:02
【问题描述】:

我对 C 很陌生,我似乎弄乱了我的位掩码。据我了解,这是一种从二进制值中获取或创建子集的方法。

假设我想获取一个 unsigned int 值的最后 8 位,包含 00001111000011110000111100001111。

我将如何使用 AND/OR 来获取最后 8 个?

【问题讨论】:

标签: c binary hex bit bitmask


【解决方案1】:

这是一个更通用的解决方案,可以根据您感兴趣的位数生成掩码。

unsigned int last_n_bits(unsigned int value, int n)
{
    unsigned int mask = -1;
    if (n < sizeof(unsigned) * CHAR_BIT)
        mask = ((1<<n)-1);
    return value & mask;
}

【讨论】:

  • 你应该assert那个n &lt; sizeof(unsigned) * CHAR_BIT
  • 然后你在获取所有位时遇到了问题。
  • unsigned 的宽度在技术上可能小于sizeof(unsigned)*CHAR_BIT,因为可能存在填充位,但有效地处理这个问题会延长你的答案,但实际上并没有什么好处。
【解决方案2】:

您可以使用 BINARY AND 运算符来进行二进制掩码:

unsigned char last_eight_bits = my_number & 0b11111111

【讨论】:

  • 如果目标是char(或(通常)8 位宽的其他类型),则不需要位操作。 8 乘以 1 也比 2 乘以 f 更难计算。
【解决方案3】:

屏蔽所有位 &gt; 0xff:

value & 0xffu

【讨论】:

  • 或者使用(1 &lt;&lt; 8) - 1 创建一个掩码,其中 8 表示要抓取的位数(当然要注意不要超过整数的大小)。
【解决方案4】:

假设我想获取 unsigned int 值的最后 8 位,其中包含 00001111000011110000111100001111。

我将如何使用 AND/OR 来获取最后 8 个?

在这种情况下,您将使用 AND。以下代码将抓取 8 个最低有效位:

unsigned int number = 0x0F0F0F0Fu;
unsigned int mask = 0x000000FFu; // set all bits to "1" which you want to grab
unsigned int result = number & mask; // result will be 0x0000000F

&amp;-Operator 用于与每个位进行 AND 操作:

    00001111000011110000111100001111
AND 00000000000000000000000011111111
------------------------------------
    00000000000000000000000000001111

请注意“0 AND X = 0”和“1 AND X = X”。您可以通过以下方式进行进一步调查:https://en.wikipedia.org/wiki/Boolean_algebra

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多