这个声明的意思是什么?
这个声明的意思是什么?
我不是C/C++的专家。\n我今天发现了这个声明:\n
typedef NS_OPTIONS(NSUInteger, PKRevealControllerType) { PKRevealControllerTypeNone = 0, PKRevealControllerTypeLeft = 1 << 0, PKRevealControllerTypeRight = 1 << 1, PKRevealControllerTypeBoth = (PKRevealControllerTypeLeft | PKRevealControllerTypeRight) };
\n你们能否翻译一下每个值都代表什么?
这段代码是用Objective C编写的,不是用C++。
1 << 0
是将1左移0位。任何整数"<<0"都等于它本身。
所以
1 << 0 = 1
同样地,
1 << 1
是将1左移1位。你可以用多种方式来理解,最简单的方式是乘以2.[注1]
所以
x << 1 == x*2
或者
1 << 1 == 2
最后,单个管道操作符是位或运算。
所以
1 | 2 = 3
PKRevealControllerTypeNone = 0 PKRevealControllerTypeLeft = 1 PKRevealControllerTypeRight = 2 PKRevealControllerTypeBoth = 3
[1] 这个概括有一些限制,例如当x等于或大于数据类型可以存储的最大值的一半时。
为什么不直接设置为0、1、2、3呢?有什么理由这样搞得疯狂一些吗?
这些值是标志而不是数字。这种设置使得每个标志都是独立的,最后一个是其他两个的组合。如果你有20个标志,使用“正常”的数字会变得困难;65544是什么意思?以这种形式,我会知道它是(1<<16) | (1<<3)
,这意味着它代表了2个标志。只要学习位移操作符,就不再是“疯狂”的了。
好吧,它编译成相同的代码,所以唯一的区别就是它在源代码中的表达方式。我认为这种方法可能比0、1、2、3更好。不过有三个因素使它看起来有点奇怪:[1]他们为“None”(0)定义了一个单独的值。这种做法并不常见。[2]他们为(1|2)定义了一个单独的变量。通常也不这样做。通常,标志的十进制值按2的幂递增——1,2,4,8,16等等。而[3],位域中只使用了2位。通常会使用更多的位。
我总是定义一个0值,因为(在C++中)如果你只发送(int)0,当你不想设置任何标志时,它不会开心,而且你不能总是依赖默认值。组合标志也是相当常见的,以及使用别名,因为这样可以使使用该函数的代码更可读。而且,有这么短的位域也不是很不寻常!事实上,标准的cocoa库中有许多几乎和这个一样短的例子。
感谢你的见解。我自己不是ObjC开发者,所以关于cocoa库的注释很有意思。如果我使用别名,我通常会在一个单独的地方定义,但我想他们在这里这样做了——长度是误导人的。至于定义为0,那是很有道理的——我C的背景占了上风 🙂
这段内容介绍了一个枚举类型的位标志。首先,声明了三个枚举值:PKRevealControllerTypeNone、PKRevealControllerTypeLeft和PKRevealControllerTypeRight。其中,PKRevealControllerTypeNone的值为0,PKRevealControllerTypeLeft的值为1左移0位(即1),PKRevealControllerTypeRight的值为1左移1位(即2)。
接着,通过使用位运算符进行按位或操作,得到了PKRevealControllerTypeBoth的值。PKRevealControllerTypeBoth的值是PKRevealControllerTypeLeft和PKRevealControllerTypeRight的按位或结果,即3。
其中,"<< "运算符是左移运算符," | "运算符是按位或运算符。
总结起来,各个枚举值的含义如下:
PKRevealControllerTypeNone的值为0
PKRevealControllerTypeLeft的值为1
PKRevealControllerTypeRight的值为2
PKRevealControllerTypeBoth的值为3
但更加合理的理解方式是将它们看作是位的标志,或者是一个集合,其中通用集合为{ PKRevealControllerTypeLeft, PKRevealControllerTypeRight }。
要了解更多信息,需要阅读关于枚举、位移运算符和位运算符的相关资料。
这段代码中出现了一个声明,声明了几个变量的值,但是声明的方式相对复杂,使用了位运算符和或运算符。文章中提到了位运算符<<是按位左移运算符,将所有的位向左移动指定的次数。一个左移表示乘以2。并且给出了一个具体的例子来解释左移的过程。文章还提到了或运算符|的使用,给出了一个具体的例子来解释或运算的过程。最后,文章也提到了这种声明方式的理由,主要是为了代码的一致性和可读性,并提供了一些相关的讨论和参考资料。
文章整体讲解了这段代码的含义和一些相关的概念,没有明确提出问题,因此问题的出现原因是缺乏明确的问题陈述。解决方法是对文章进行适当的修改,明确提出问题"这个声明的含义是什么"。然后对文章的内容进行整理和修改,使其回答这个问题。最后,将整理好的内容输出成一篇中文文章。