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

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

/* 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

知道的请帮帮我,万分感谢!:)

4

1 回答 1

5

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

有时您还会看到这些以十六进制编写的内容,因为与十进制常量相比,它更接近于底层二进制表示,并且可以更紧凑。

于 2013-09-07T00:53:46.480 回答