这个声明的含义是什么?
我不是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时。