如果您考虑需要做什么,您只需要关注一元>> 移位运算符和& 运算符。它还有助于提出一个位掩码,以便仅将那些需要的位从可能需要的任何中间计算中隔离出来。 (位掩码只是一个变量,其中包含一个数字,其1 位和0 位可以在按位运算中使用,以提供您想要的结果)。
在这里,在您所有的位分离中,您将只关心移位后的 2 或 3 个低位以获得最终结果。在您查看(7,6) 的情况下,没有其他位需要掩码,只有您正在查看需要掩码的低 3 位的情况。
从 位掩码(或什么是幻数)的角度来看,您需要一个掩码来保留最后 3 位并丢弃所有剩余的高位。因此,对于 8 位值,您需要 00000111,或者只是数字 7。
首先,如果您想检查一个 8 位数字中的最高 2 位,那么您只需将您的数字右移6,例如给定一个字节 b 在您的情况下保存总值 0x00110000,您需要。
b >> 6;
这里不需要屏蔽任何东西,因为没有更高的位。
对于您示例中的位(5,4,3),您需要向右移动3,然后您需要将& 与您的mask(7 或b00000111)的中间结果去掉剩下的两位(6,7),例如
uint8_t mask = 7;
...
(b >> 3) & mask;
在最后一部分,您的(2,1,0) 位,不需要移位,您只需清除位2 上的所有位,例如用你的面具摆脱(7,6,5,4,3),
b & mask
总而言之,使用精确宽度类型,您可以执行类似于以下的操作。该程序将您的字节值作为其第一个参数(使用48,例如,如果没有给出参数,则默认使用0x0011000)并输出移位和掩码的结果:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
int main (int argc, char *argv[]) {
uint64_t tmp = argc > 1 ? strtoul (argv[1], NULL, 0) : 48;
uint8_t b = 0,
mask = 7;
if (tmp > UINT8_MAX) {
fprintf (stderr, "input exceeds UINT8_MAX.\n");
return 1;
}
b = (uint8_t)tmp;
printf ("(7,6) 0x%02" PRIx8 "\n", b >> 6);
printf ("(5,4,3) 0x%02" PRIx8 "\n", (b >> 3) & mask);
printf ("(2,1,0) 0x%02" PRIx8 "\n", b & mask);
return 0;
}
使用/输出示例
$ /bin/bytes_233
(7,6) 0x00
(5,4,3) 0x06
(2,1,0) 0x00
检查一下,如果您还有其他问题,请告诉我。