【问题标题】:Bitstrings and flag shifting位串和标志移位
【发布时间】:2019-08-15 16:01:53
【问题描述】:

我对按位和所有有趣的爵士乐都很陌生,所以不太了解它的所有内容。我有两个问题。

A) 标志和位移问题

我最近遇到了类似下面的东西

if (flags & (1 << 3)) {
    function_A();
}

我可以看到是一个 AND 运算符和一个左移位,但是当我通常遇到左移位时,我不确定标志的作用及其用途(据我了解,它是一个布尔值的集合以节省空间),它是诸如 10100101

B) 也是一个标志问题(与第一个问题有关)。

TCP 包含由字节 13 中的 1 位标志组成的数据包。字节 13 的位(我相信是位 1)是请求连接的 SYN 标志。要“请求连接”,假设您可以访问它,假设它存储在某种数组中并且通过 packetNO[13] 访问,那么您将如何准确地调用该位。会和下面类似吗?

if (packetNO[13] & (1 << 2)) {
}

上述检查是否已请求连接,通过将真实位移动到位置 2(位 1?)

请向我解释这些概念并提供示例以提供帮助,我不确定我是否正确。

【问题讨论】:

    标签: arrays bit-manipulation bitwise-operators bit-shift bitflags


    【解决方案1】:

    and 运算符是这样的,只有当两个操作数都为 1 时,它的输出才为 1。 因此

    if(f & 1) { ... }
    

    tests 是设置f 的最低有效位。

    如果您想测试是否设置了另一个位,有两种方法可以做到这一点。

    1. 使用按位移位运算符&lt;&lt; 将其操作数移位给定数量。例如,要测试是否设置了第三位(或从 lsb 计数的第 2 位),您可以使用1&lt;&lt;2。这将产生一个等于000..00100 的数字,并且通过anding,这将检查相应的位是否已设置。
    if(f & (0x1<<2)) { ... }
    
    1. 或者,您可以使用hexadecimal 数字来描述您要测试的位模式。 同样的测试可以使用0x4来完成,因为4的二进制代码是000..0100
    if(f & 0x4) { ... }
    

    由您决定哪个更具可读性。

    因此,您问题中的第一个测试检查是否设置了标志的第四位(位 #3),第二个测试是否设置了 packect[13] 的位 #1。

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多