【发布时间】:2018-11-19 17:37:02
【问题描述】:
我对 C 很陌生,我似乎弄乱了我的位掩码。据我了解,这是一种从二进制值中获取或创建子集的方法。
假设我想获取一个 unsigned int 值的最后 8 位,包含 00001111000011110000111100001111。
我将如何使用 AND/OR 来获取最后 8 个?
【问题讨论】:
-
到目前为止你尝试过什么?你的 C 代码尝试在哪里?
我对 C 很陌生,我似乎弄乱了我的位掩码。据我了解,这是一种从二进制值中获取或创建子集的方法。
假设我想获取一个 unsigned int 值的最后 8 位,包含 00001111000011110000111100001111。
我将如何使用 AND/OR 来获取最后 8 个?
【问题讨论】:
这是一个更通用的解决方案,可以根据您感兴趣的位数生成掩码。
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 < sizeof(unsigned) * CHAR_BIT
sizeof(unsigned)*CHAR_BIT,因为可能存在填充位,但有效地处理这个问题会延长你的答案,但实际上并没有什么好处。
您可以使用 BINARY AND 运算符来进行二进制掩码:
unsigned char last_eight_bits = my_number & 0b11111111
【讨论】:
char(或(通常)8 位宽的其他类型),则不需要位操作。 8 乘以 1 也比 2 乘以 f 更难计算。
屏蔽所有位 > 0xff:
value & 0xffu
【讨论】:
(1 << 8) - 1 创建一个掩码,其中 8 表示要抓取的位数(当然要注意不要超过整数的大小)。
假设我想获取 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
&-Operator 用于与每个位进行 AND 操作:
00001111000011110000111100001111
AND 00000000000000000000000011111111
------------------------------------
00000000000000000000000000001111
请注意“0 AND X = 0”和“1 AND X = X”。您可以通过以下方式进行进一步调查:https://en.wikipedia.org/wiki/Boolean_algebra。
【讨论】: