位串和标志移位
Bitstrings and flag shifting
我对按位和所有有趣的爵士乐还很陌生,所以不太了解它的一切。我有两个问题。
A) 标志和移位问题
我最近 运行 遇到了类似于下面的东西
if (flags & (1 << 3)) {
function_A();
}
我可以看到它是一个 AND 运算符和一个左移位,但是我不确定该标志的作用及其用途(据我所知,它是要保存的布尔值集合 space),当我通常遇到左移,比如 10100101 << 3,应该是 00101000(我相信),但这里似乎不是这种情况。那么调用上述函数的具体条件是什么?
B) 也是一个标记问题(由于它的性质与第一个相关)。
TCP 包含由字节中的 1 位标志组成的数据包 13.There 是字节 13 的一位(我相信是位 1),这是请求连接的 SYN 标志。 "request a connection" 假设您可以访问它并假设它存储在某种数组中并通过 packetNO[13] 访问,您将如何准确调用该位。会不会像下面这样?
if (packetNO[13] & (1 << 2)) {
}
以上通过将真位移动到位置 2(位 1?)来检查是否已请求连接
请向我解释这些概念,并尽可能提供示例以提供帮助,我不确定我是否正确。
and 运算符是这样的,只有当两个操作数都为 1 时,它的输出才为 1。
因此
if(f & 1) { ... }
tests 是 f
的最低有效位已设置。
如果您想测试是否设置了另一个位,有两种方法可以做到。
- 使用移位运算符
<<
将其操作数移位给定的量。例如,要测试是否设置了第三位(或从 lsb 开始计数的位 #2),您可以使用 1<<2
。这将导致一个数字等于 000..00100
并且通过 和 ing,这将检查是否设置了相应的位。
if(f & (0x1<<2)) { ... }
- 或者,您可以使用 hexadecimal 数字来描述您要测试的位模式。
同样的测试可以用
0x4
来完成,因为4的二进制代码是000..0100
if(f & 0x4) { ... }
由您决定哪一个更具可读性。
因此,您问题中的第一个测试检查是否设置了标志的第四位(第 #3 位),第二个测试是否设置了 packect[13]
的第 #1 位。
我对按位和所有有趣的爵士乐还很陌生,所以不太了解它的一切。我有两个问题。
A) 标志和移位问题
我最近 运行 遇到了类似于下面的东西
if (flags & (1 << 3)) {
function_A();
}
我可以看到它是一个 AND 运算符和一个左移位,但是我不确定该标志的作用及其用途(据我所知,它是要保存的布尔值集合 space),当我通常遇到左移,比如 10100101 << 3,应该是 00101000(我相信),但这里似乎不是这种情况。那么调用上述函数的具体条件是什么?
B) 也是一个标记问题(由于它的性质与第一个相关)。
TCP 包含由字节中的 1 位标志组成的数据包 13.There 是字节 13 的一位(我相信是位 1),这是请求连接的 SYN 标志。 "request a connection" 假设您可以访问它并假设它存储在某种数组中并通过 packetNO[13] 访问,您将如何准确调用该位。会不会像下面这样?
if (packetNO[13] & (1 << 2)) {
}
以上通过将真位移动到位置 2(位 1?)来检查是否已请求连接
请向我解释这些概念,并尽可能提供示例以提供帮助,我不确定我是否正确。
and 运算符是这样的,只有当两个操作数都为 1 时,它的输出才为 1。 因此
if(f & 1) { ... }
tests 是 f
的最低有效位已设置。
如果您想测试是否设置了另一个位,有两种方法可以做到。
- 使用移位运算符
<<
将其操作数移位给定的量。例如,要测试是否设置了第三位(或从 lsb 开始计数的位 #2),您可以使用1<<2
。这将导致一个数字等于000..00100
并且通过 和 ing,这将检查是否设置了相应的位。
if(f & (0x1<<2)) { ... }
- 或者,您可以使用 hexadecimal 数字来描述您要测试的位模式。
同样的测试可以用
0x4
来完成,因为4的二进制代码是000..0100
if(f & 0x4) { ... }
由您决定哪一个更具可读性。
因此,您问题中的第一个测试检查是否设置了标志的第四位(第 #3 位),第二个测试是否设置了 packect[13]
的第 #1 位。