首页 > 解决方案 > 为什么这个人使用 (1 << 0)?

问题描述

我正在阅读有关函数实现的代码,编写代码的人在他的.h中写了这个:

#define FT_LS_LONG      (1 << 0)
#define FT_LS_RECURSIVE (1 << 1)
#define FT_LS_HIDDEN    (1 << 2)
#define FT_LS_REVERSE   (1 << 3)
#define FT_LS_TIME      (1 << 4)
#define FT_LS_LINE      (1 << 5)

为什么他使用按位左移而不是其他东西?而且,他可以用什么替换这部分代码?我知道 (1 << 0) == 0000 0001 (1 << 1) == 0000 0010 等。但我不明白你如何使用这些。

标签: c

解决方案


这些结构通常用于组合成单个单词的标志中。它们可以使用按位或运算符组合,例如:

int flags = FT_LS_LONG | FT_LS_HIDDEN;

在上面的代码中,flags变量将被设置为 0000 0101。flags然后可以使用按位与运算符来测试变量,例如:

if (flags & FT_LS_LONG) { foo(); }

if 语句将评估为 true,并且 foo() 函数将被调用。

if (flags & FT_LS_TIME) { bar(); }

if 语句将评估为 false,并且不会调用 bar() 函数。


推荐阅读