这是什么意思?
我知道这将定义
谢谢!
#define WS_RECURSIVE (1 << 0)
我知道这将定义
WS_Recursive (1 << 0)
,但是<<
是什么意思呢?谢谢!
#define WS_RECURSIVE (1 << 0)
WS_Recursive (1 << 0)
,但是<<
是什么意思呢?<<
是左移运算符。它将数字1
向左移动0
位,这等同于数字1
。
它通常用于创建标志,这些数字可以与|
(或)组合在一起,并且可以对它们应用各种操作,例如测试是否设置了标志,设置标志,删除标志等。
它们可以相互组合而不会干扰彼此的原因是每个标志都是2的幂,这就是使用1 << x
的原因,因为这产生了2的幂:
1 << 0 == 20 == 1 == 二进制 0001
1 << 1 == 21 == 2 == 二进制 0010
1 << 2 == 22 == 4 == 二进制 0100
1 << 3 == 23 == 8 == 二进制 1000
等等
您可以在这里阅读有关位标志的内容:http://www.codeproject.com/KB/tips/Binary_Guide.aspx
这是一个向左位移。因此,1 << 0 实际上是 1。当您想定义一些标志时,通常会使用此方法,每个标志都设置为一个位,例如:
#define FLAG1 (1 << 0)
#define FLAG2 (1 << 1)
#define FLAG3 (1 << 2)
#define FLAG4 (1 << 3)
<<
运算符将左侧的值向左移动 (右侧值) 位。你的例子什么也没做!1 向左移动 0 位仍然是 1。但是,1 << 1
是 2,1 << 2
是 4,以此类推。WS_RECURSIVE 是位字段中的标志吗?
<<
是按位左移运算符。将 1 左移 0 位,结果仍为 1。
我还注意到你的代码来源中也有:
#define WS_RECURSIVE (1 << 0)
#define WS_DEFAULT WS_RECURSIVE
#define WS_FOLLOWLINK (1 << 1)
#define WS_DOTFILES (1 << 2)
#define WS_MATCHDIRS (1 << 3)
这是一种创建位域的方法,其中您可以使用OR(|
)将标志组合在一起,并使用AND(&
)检查它们是否已设置。
(1 << 1)
是 2
,(1 << 2)
是 4
。 (1 << 0)
是 1
,看起来有点傻,但至少它在编译时预先计算了。
(1 << 1)
、(1 << 2)
、(1 << 3)
等。 - Matteo Italia