这个声明的含义是什么?

我不是C / C ++的专家。

我今天发现了这个声明:

typedef NS_OPTIONS(NSUInteger, PKRevealControllerType)
{
    PKRevealControllerTypeNone  = 0,
    PKRevealControllerTypeLeft  = 1 << 0,
    PKRevealControllerTypeRight = 1 << 1,
    PKRevealControllerTypeBoth = (PKRevealControllerTypeLeft | PKRevealControllerTypeRight)
};

你们可以翻译每个价值会有的价值吗?


opertor <<是按位左移运算符。 将所有位左移一个指定的次数:(算术左移并保留符号位)

m << n

m所有位左移n次。 (注意一班==乘以二)。

1 << 0表示没有移位,因此它只等于1

1 << 1意味着一个移位,因此它等于1*2 = 2。

我用一个字节解释:一个字节中的一个就像:

 MSB
+----+----+----+---+---+---+---+---+
|  0 |  0 | 0  | 0 | 0 | 0 | 0 | 1 |       1   
+----+----+----+---+---+---+---+---+
  7     6   5    4   3   2   1 / 0  
  |                           /           1 << 1
  |                          | 
  ▼                          ▼
+----+----+----+---+---+---+---+---+
|  0 |  0 | 0  | 0 | 0 | 0 | 1 | 0 |       2      
+----+----+----+---+---+---+---+---+ 
   7    6   5    4   3   2   1   0

1 << 0除了像图1之外什么都不做。 (注意第7位被复制以保存符号)

OR运算符:做比特式或

 MSB                            PKRevealControllerTypeLeft
+----+----+----+---+---+---+---+---+
|  0 |  0 | 0  | 0 | 0 | 0 | 0 | 1 |  == 1
+----+----+----+---+---+---+---+---+
   7    6   5    4   3   2   1   0
   |    |    |   |   |   |   |   |      OR
 MSB                               PKRevealControllerTypeRight
+----+----+----+---+---+---+---+---+
|  0 |  0 | 0  | 0 | 0 | 0 | 1 | 0 |   == 2
+----+----+----+---+---+---+---+---+
   7    6   5    4   3   2   1   0

 = 

 MSB                    PKRevealControllerTypeBoth
+----+----+----+---+---+---+---+---+
|  0 |  0 | 0  | 0 | 0 | 0 | 1 | 1 |   == 3
+----+----+----+---+---+---+---+---+
   7    6   5    4   3   2   1   0  

| 是位运算符。 在下面的代码它or 1 | 2 1 | 2 == 3

PKRevealControllerTypeNone  = 0,             //  is Zero
PKRevealControllerTypeLeft  = 1 << 0,        //  one 
PKRevealControllerTypeRight = 1 << 1,        //  two
PKRevealControllerTypeBoth = (PKRevealControllerTypeLeft |    
                             PKRevealControllerTypeRight)  // three

没有更多的技术理由来初始化这样的值,这样定义就可以很好地阅读这个答案:define SOMETHING(1 << 0)

编译器优化将它们转换为更简单的形式:(我不确定是否有第三个,但我认为编译器也会优化它)

PKRevealControllerTypeNone  = 0,     //  is Zero
PKRevealControllerTypeLeft  = 1,     //  one 
PKRevealControllerTypeRight = 2,     //  two
PKRevealControllerTypeBoth  = 3,     // Three

编辑: @感谢直到。 阅读此答案使用BOOL标志的应用程序状态显示使用位智能运算符得到的声明的用处。


这是一个位标志的枚举:

PKRevealControllerTypeNone  = 0       // no flags set
PKRevealControllerTypeLeft  = 1 << 0, // bit 0 set
PKRevealControllerTypeRight = 1 << 1, // bit 1 set

接着

PKRevealControllerTypeBoth = 
  (PKRevealControllerTypeLeft | PKRevealControllerTypeRight)

仅仅是对另外两个标志进行按位或运算的结果。 所以,位0和位1设置。

<<运算符是左移运算符。 和| 运算符按位或。

总之,结果值是:

PKRevealControllerTypeNone  = 0
PKRevealControllerTypeLeft  = 1
PKRevealControllerTypeRight = 2
PKRevealControllerTypeBoth  = 3

但是根据比特标志考虑它会更有意义。 或者作为通用集的集合:{PKRevealControllerTypeLeft,PKRevealControllerTypeRight}

要了解更多信息,您需要阅读关于枚举,转换运算符和位运算符。


这看起来像Objective C而不是C ++,但是不管:

1 << 0

只是一个左移位(向上)0位置。 任何整数“<< 0”就是其本身。

所以

1 << 0 = 1

同样

1 << 1

只是一个位置左移一位而已。 您可以通过多种方式将其视觉化,但最简单的方法是乘以2. [注1]

所以

x << 1 == x*2

要么

1 << 1 == 2

最后单管操作员是按位或。

所以

1 | 2 = 3

TL;博士:

PKRevealControllerTypeNone  = 0
PKRevealControllerTypeLeft  = 1
PKRevealControllerTypeRight = 2
PKRevealControllerTypeBoth  = 3

[1]这种泛化有一些限制,例如当x等于或大于数据类型能够存储的最大值的1/2时。

链接地址: http://www.djcxy.com/p/72483.html

上一篇: What is the meaning of this declaration?

下一篇: define SOMETHING (1 << 0)