c - 是否有适用于所有系统的通用 "isolate a single byte"位掩码,而不考虑 CHAR_BIT?

标签 c byte

如果目标系统上的 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,结果是 SomeIntegerUCHAR_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/

相关文章:

java - Android 内存泄漏,EMA 疑似 : "byte[]" loaded by "<system class loader>"

java - 如何打包和解包给定特定格式的长变量?

c# - DotNetZip:将 ZipFile 转换为 byte[] 数组

xml - R:readBin 字符限制(10 000 字节)的解决方法?

c - 为什么我的 C 队列中出现段错误(核心已转储)?

c - linux kernel convert char * to uint8_t[6] (读字符串到mac)

将 uint8_t 转换为二进制

c - 比较浮点型和浮点型元素数组时出错

c - 线程数组中的第一个线程在 c 中被跳过(有时)?

c - 在此代码中可以将 8 位或 16 位值存储到 16 位对齐缓冲区吗?