c - 如何屏蔽 64 位数字的前 2 个 MSB 字节?

标签 c bit-manipulation byte

我有一个64位无符号整数。其中前两个 MSB 字节包含 0。如何屏蔽掉前两个 MSB 字节?

uint64 value;
value = 0000 0000 0000 0000 0000 1101 1111 1010 1110 1111 1111 1111 0101 
0101 1101 1101;
uint48 answer;
answer = 0000 1101 1111 1010 1110 1111 1111 1111 0101 
0101 1101 1101;

在上面的示例中,该值是一个 64 位数字。我希望答案包含除前 2 个字节之外的所有位。因此,我可以将 answer 打包到大小为 6 的字节数组中。我怎样才能在C中实现这一点?

最佳答案

用 48 个 1 位掩码:0xffffffffffff

uint64_t value = <something>;
uint48_t answer = src & 0xffffffffffff;

但是如果您知道 2 MSB 为零,则无需进行任何屏蔽,只需分配变量即可:

uint48_t answer = value;

要将它们存储在字节数组中,请按适当的字节数移位并使用 0xff 进行掩码以获得单个字节。

uint8_t bytes[6];
for (int i = 0; i < 6; i++) {
    bytes[i] = (value >> (40 - 8 * i)) & 0xff;
}

您可以使用原始 64 位值或 48 位值,这适用于至少 6 字节的任何大小。

关于c - 如何屏蔽 64 位数字的前 2 个 MSB 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56984413/

相关文章:

c++ - Cuda:访问冲突写入位置 0x0000000000000000

c - 为什么 math.h 不定义倒数三角函数?

带有表达式不需要的结果的 C 宏

c - 如何忽略 sscanf 中的已知单词?

haskell - 第一位的索引

c++ - 如何将 CString 转换为 BYTE?

php - 位移 : Can someone explain what this code does?

java - 为什么 -1 右移 1 = -1 在 Java 中?

使用按位运算符检查字节

python - 如何在python3中用无字符替换 `c2a0`?