位串和标志移位

时间:2019-03-25 12:01:56

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

我对位音乐和所有有趣的爵士乐还很陌生,所以对它的所有知识都不了解。我有两个问题。

A)一个标志和移位问题

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

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

我看到的是一个AND运算符和一个左移,但是当我通常遇到左移时,我不确定该标志的作用及其目的(据我所知,它是一组布尔值以节省空间),例如10100101 << 3,应该是00101000(我相信),但是这里似乎并非如此。那么调用上述函数的条件是什么?

B)也是一个标记问题(由于其性质而与第一个相关)。

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

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

通过将真正的位移到位置2(位1?)来检查是否已请求连接

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

1 个答案:

答案 0 :(得分:1)

and运算符的结果是,只有两个操作数都为1时,其输出才为1。 因此

if(f & 1) { ... }

tests是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位进行了设置。