Bitstrings和旗帜转移

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bitstrings和旗帜转移相关的知识,希望对你有一定的参考价值。

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

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?)

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

答案

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。

以上是关于Bitstrings和旗帜转移的主要内容,如果未能解决你的问题,请参考以下文章

javascript 获取国家代码和Countires旗帜w.r.t国家代码

如何从使用视图寻呼机创建的选项卡片段转移到另一个片段

片段 getActivity 不起作用

[搬运] 将 Visual Studio 的代码片段导出到 VS Code

旗帜识别基于matlab GUI旗帜识别含Matlab源码 1383期

如何有条件地将 C 代码片段编译到我的 Perl 模块?