C在一个字节中存储2个数字

cap*_*him 1 c binary bit-shift

u_char  ip_vhl;     /* version << 4 | header length >> 2 */
Run Code Online (Sandbox Code Playgroud)

我做不到,这是怎么做到的?你能举例说明如何使用这个字节存储这2个数字,知道每个数字都是4位

unw*_*ind 5

如果每个数字是4位,则您将使用该字符的最低8位.在许多情况下,这将是所有的位.

这样做:

ip_vhl = ((version & 15) << 4) | (length & 15);
Run Code Online (Sandbox Code Playgroud)

假设version你想要的是高位,length你想要的是最低位.在& 15确保每个值仅为4位.这个值主要是需要的length,以避免覆盖专用于versionif长度的位大于15.十进制常量15将以十六进制(as 0xf0x0f)写入很多人,这是一个风格和品味的问题,你发现更清洁.

编写"一个整数,其中n个最右边的位设置为1,而所有其他设置为0"的另一种方法是((1 << n) - 1),因为n = 4我们可以使用((1 << 4) - 1),这当然是评估的15.

您的代码似乎首先分解length并存储,如果这是您想要做的,您应该在将其打包到单个之前执行char,为清楚起见:

length >>= 2;  /* Convert from bytes to 32-bit words (or whatever). */
ip_vhl = ((version & 15) << 4) | (length & 15);
Run Code Online (Sandbox Code Playgroud)

  • 0xf而不是15会看起来更好 (4认同)