如果目标系统上的 CHAR_BIT == 8
(大多数情况下),则很容易屏蔽掉单个字节:
unsigned char lsb = foo & 0xFF;
但是,在一些系统和 C 实现中,CHAR_BIT
既不是 8 也不是其倍数。由于 C 标准仅规定 char
值的最小范围,因此无法保证使用 0xFF
进行屏蔽会为您隔离整个字节。
我四处搜索,试图找到有关通用“字节掩码”的信息,但到目前为止还没有找到任何信息。
总有 O(n) 的解决方案:
unsigned char mask = 1;
size_t i;
for (i = 0; i < CHAR_BIT; i++)
{
mask |= (mask << i);
}
但是,鉴于此任务在许多系统级编程场景中的重要性,我想知道是否有任何 O(1) 宏或某处代码行可以完成此任务。
最佳答案
从整数值中提取 unsigned char
的最简单方法就是将其转换为 unsigned char
:
(unsigned char) SomeInteger
根据 C 2018 6.3.1.3 2,结果是 SomeInteger
模 UCHAR_MAX+1
的余数。 (这是一个非负余数;它总是被调整为大于或等于零且小于 UCHAR_MAX+1
。)
分配给 unsigned char
具有相同的效果,因为分配执行转换(并且初始化也有效):
unsigned char x;
…
x = SomeInteger;
如果你想要一个明确的位掩码,UCHAR_MAX
就是这样一个掩码。这是因为无符号整数在 C 中是纯二进制,并且无符号整数的最大值已设置所有值位。 (无符号整数一般也可能有填充位,但 unsigned char
可能没有。)
在非常古老或深奥的系统中可能会出现一个差异:如果有符号整数用符号和大小或一个补码表示,而不是今天普遍存在的二进制补码,那么提取 unsigned char
根据您使用的是转换方法还是位掩码方法,负值会有所不同。
关于c - 是否有适用于所有系统的通用 "isolate a single byte"位掩码,而不考虑 CHAR_BIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54350996/