#define WS_RECURSIVE (1 << 0)
我知道它会定义WS_Recursive (1 << 0)
,但<<
是什么意思?
谢谢!
答案 0 :(得分:20)
<<
是left shift operator。它将数字1
移至左0
位,相当于数字1
。
它通常用于创建标志,可以与|
(位或)组合在一起的数字,并且可以对它们应用各种操作,例如测试标志是否为设置,设置标志,删除标志等
它们可以组合在一起而不会相互干扰的原因是每一个都是的两个的力量,这就是使用1 << x
的原因,因为它产生了权力两个:
1&lt;&lt; 0 == 2 0 == 1 ==二进制0001
1&lt;&lt; 1 == 2 1 == 2 ==二元0010
1&lt;&lt; 2 == 2 2 == 4 ==二元0100
1&lt;&lt; 3 == 2 3 == 8 ==二元1000
等
您可以在此处阅读有关位标志的信息:http://www.codeproject.com/KB/tips/Binary_Guide.aspx
答案 1 :(得分:4)
这有点向左移动。所以1&lt;&lt; 0实际上是1.当你想要定义一些标志时,它通常以这种方式使用,每个标志都是一位设置,例如:
#define FLAG1 (1 << 0)
#define FLAG2 (1 << 1)
#define FLAG3 (1 << 2)
#define FLAG4 (1 << 3)
答案 2 :(得分:1)
<<
计算向左的按位移位。将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)
这是一种创建bit fields的方法,其中OR(|
)标记在一起,而AND它们(&
)则检查它们是否已设置。
答案 3 :(得分:1)
<<
运算符将左侧值左移(右侧值)位。你的例子什么都没做! 1向左移位0位仍为1.但是,1 << 1
为2,1 << 2
为4,等等。是否WS_RECURSIVE是位域中的标志?
答案 4 :(得分:0)
这有点转变。 (1 << 1)
为2
,(1 << 2)
为4
。 (1 << 0)
是1
,这是相当愚蠢的,但至少它是在编译时预先计算的。