C语言中的'<<'表示什么?

6
这是什么意思?
#define WS_RECURSIVE    (1 << 0)

我知道这将定义WS_Recursive (1 << 0),但是<<是什么意思呢?
谢谢!

7
猜测:在此之后会跟随其他常量,它们被定义为(1 << 1)(1 << 2)(1 << 3)等。 - Matteo Italia
@MatteoItalia:这根本不算什么疯狂的。 - Matt K
4
它不是野生的,因为它包含在一个源文件中。如果它是放养的,那就不同了。 - Thomas Eding
5个回答

32

<<左移运算符。它将数字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


5

这是一个向左位移。因此,1 << 0 实际上是 1。当您想定义一些标志时,通常会使用此方法,每个标志都设置为一个位,例如:

#define FLAG1 (1 << 0)
#define FLAG2 (1 << 1)
#define FLAG3 (1 << 2)
#define FLAG4 (1 << 3)

1

<< 运算符将左侧的值向左移动 (右侧值) 位。你的例子什么也没做!1 向左移动 0 位仍然是 1。但是,1 << 1 是 2,1 << 2 是 4,以此类推。WS_RECURSIVE 是位字段中的标志吗?


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)

这是一种创建位域的方法,其中您可以使用OR(|)将标志组合在一起,并使用AND(&)检查它们是否已设置。


0
这是一个位移操作。 (1 << 1)2(1 << 2)4(1 << 0)1,看起来有点傻,但至少它在编译时预先计算了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接