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
,这是相当愚蠢的,但至少它是在编译时预先计算的。