Bitstrings和旗帜转移

问题描述 投票:0回答:1

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

A)标志和位移问题

我最近遇到了类似于下面的内容

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

我可以看到是一个AND运算符和一个左移位,但我不确定该标志的作用及其目的(据我所知,它是一个节省空间的布尔集合),当我经常遇到左移时,它是某种东西例如10100101 << 3,这将是00101000(我相信),但这似乎不是这里的情况。那么上述函数的调用条件究竟是什么?

B)还有一个标志问题(由于其性质而与第一个问题相关)。

TCP包含由字节13中的1位标志组成的数据包。有一个字节13(我相信第1位),它是请求连接的SYN标志。为了“请求连接”,如果你可以访问它,假设它存储在某种类型的数组中并且被访问VIA packetNO [13],你将如何调用该位。它会在下面类似吗?

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

上面检查是否已经请求连接,通过将一个真位移到位置2(位1?)

请向我解释这些概念并提供示例以便在可能的情况下提供帮助,我不确定我是否正确。

arrays bit-manipulation bitwise-operators bit-shift bitflags
1个回答
1
投票

and运算符只有在两个操作数均为1时才输出。因此

if(f & 1) { ... }

测试是f设置的最不重要的位。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.