C中的“<<”是什么意思?

这是什么意思?

#define WS_RECURSIVE (1 << 0) 

据我所知,它将定义WS_Recursive (1 << 0)<<是什么意思?

谢谢!

<<是左移算子 。 它将数字1移位到左侧0位,相当于数字1

它通常用于创建标志 ,可以与|组合在一起的数字 (位或)和各种操作可以应用于它们,例如测试是否设置了标志,设置标志,删除标志等。

它们可以组合在一起而不会相互干扰的原因是每个都是2的 ,这就是使用1 << x的原因,因为它产生两个幂:

1 << 0 == 2 0 == 1 ==二进制0001
1 << 1 == 2 1 == 2 ==二进制0010
1 << 2 == 2 2 == 4 ==二进制0100
1 << 3 == 2 3 == 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。

我还注意到你从那里得到你的代码的地方还有:

 #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向左移位0位仍然是1.但是, 1 << 1是2,1 1 << 2是4等等.WS_RECURSIVE是位域中的标志吗?

这有点转变。 (1 << 1)2(1 << 2)4(1 << 0)1 ,这是相当愚蠢的,但至少它是在编译时预先计算的。