“/* 重载元素数据类型 */ #define OE_IS_ARRAY (1<<0) #define OE_IS_OBJ


What's does it mean of" /* overloaded elements data types */ #define OE_IS_ARRAY (1<<0) #define OE_IS_OBJECT (1<<1) #define OE_IS_METHOD (1<<2)"?

今天,当我阅读php内核代码时,在dir:php5.3/Zend/Zend.h中,有一行代码让我感到困惑。

代码如下:

/* overloaded elements data types */
#define OE_IS_ARRAY     (1<<0)
#define OE_IS_OBJECT    (1<<1)
#define OE_IS_METHOD    (1<<2)

是这样的意思吗?我使用有四个字节的int类型,它显示左移操作。

0000 0000 0000 0000 0000 0000 0000 0000 = 0
After 1 <<
0000 0000 0000 0000 0000 0000 0000 0000 = 0
___________________________________________
0000 0000 0000 0000 0000 0000 0000 0001 = 1
After 1<<
0000 0000 0000 0000 0000 0000 0000 0010 = 2
___________________________________________
0000 0000 0000 0000 0000 0000 0000 0010 = 1
After 1<<
0000 0000 0000 0000 0000 0000 0000 0100 = 4

但是,如果她/他想这样做,为什么不直接分配常量变量呢?

/* overloaded elements data types */
#define OE_IS_ARRAY     (0)//turn the 1<<0 directly
#define OE_IS_OBJECT    (2)//turn the 1<<1 directly
#define OE_IS_METHOD    (4)//turn the 1<<2 directly

如果你知道,请帮助我,非常感谢! :)

这通常用于明确您正在谈论位标志。 1、2 和 4 会让大多数程序员意识到我们谈论的是 2 的幂序列;不是每个人都会立即知道 1<<14 是 16384。 编译器将为您执行这些计算,因此不会减慢程序速度。 一切都与清晰度有关。

您有时还会看到这些内容以十六进制形式编写,因为它比十进制常量更接近基础二进制表示形式,并且可以更紧凑。