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
设置的最不重要的位。
如果要测试是否设置了另一位,有两种方法可以做到这一点。
- 使用按位移位运算符
<<
将其操作数移位给定量。例如,要测试是否设置了第三位(或从lsb计数的位#2),您可以使用1<<2
。这将导致一个等于000..00100
的数字,并且通过和,这将检查相应的位是否设置。
if(f & (0x1<<2)) { ... }
- 或者,您可以使用hexadecimal数字来描述您要测试的位模式。使用
0x4
可以完成相同的测试,因为4的二进制代码是000..0100
if(f & 0x4) { ... }
由您决定哪一个更具可读性。
因此,您问题中的第一个测试检查是否设置了第四位标志(位#3),第二位测试是否设置了packect[13]
的位#1。
以上是关于Bitstrings和旗帜转移的主要内容,如果未能解决你的问题,请参考以下文章
javascript 获取国家代码和Countires旗帜w.r.t国家代码
[搬运] 将 Visual Studio 的代码片段导出到 VS Code