如何在 C 中打印 1 位(不仅仅是最低有效位)?

Fre*_*red 0 c bit-manipulation

我正在开发一个发送 TCP 标头的程序(模拟 3 次握手)。我有一个变量,该变量包含数据偏移量(3 位)、保留值(4 位)和 9 个标志(9 位)。我正在使用按位运算来设置位。问题是如何打印每个位?

  1. 假设我存储从 2 到 4(从左到右)开始的数据偏移量:例如。0111000000000000

如何打印这 3 位?多变的:

u_int16_t reserved_ofs_flags;
Run Code Online (Sandbox Code Playgroud)

我发现这个问题类似,但答案只适用于最不重要的问题:如何打印一位?

chq*_*lie 5

要从从位置 开始的值中提取N位(从最低有效位开始计数),可以使用以下表达式:unsignedP0

unsigned x = (value >> P) & ((1U << (N - 1) << 1) - 1);
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 从左到右对位进行编号是一种令人困惑的约定。在软件中,首选的编号方法是从最低有效位(数字 0)到最高有效位(在示例中为数字 15)。
  • 如果N是编译时常量,则((1U << (N - 1) << 1) - 1)在编译时计算表达式。
  • 该表达式假定N至少1和最多是类型中的位数unsigned
  • 如果是类型中的位数,则更简单的表达式((1U << N) - 1)具有未定义的行为。Nunsigned
  • 对于你的例子P12并且N3这样你可以写:unsigned x = (value >> 12) & 7;