枚举目标-C 和"<<"运算符
enum objective-C and "<<" operator
我正在阅读文档以NSCalendar
,出于好奇,我深入研究了CFCalendarUnit
,我看到了这个:
typedef enum {
kCFCalendarUnitEra = (1 << 1),
kCFCalendarUnitYear = (1 << 2),
kCFCalendarUnitMonth = (1 << 3),
kCFCalendarUnitDay = (1 << 4),
kCFCalendarUnitHour = (1 << 5),
kCFCalendarUnitMinute = (1 << 6),
kCFCalendarUnitSecond = (1 << 7),
kCFCalendarUnitWeek = (1 << 8),
kCFCalendarUnitWeekday = (1 << 9),
kCFCalendarUnitWeekdayOrdinal = (1 << 10),
kCFCalendarUnitQuarter = (1UL << 11),
kCFCalendarUnitWeekOfMonth = (1UL << 12),
kCFCalendarUnitWeekOfYear = (1UL << 13),
kCFCalendarUnitYearForWeekOfYear = (1UL << 14),
} CFCalendarUnit;
我像这样使用这个:
NSUInteger preservedComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
它返回124
所以我尝试这样做:
NSUInteger preservedComponents = NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
我得到30
.
我想不通。它是如何工作的?
这些只是二进制数。 1 << n
是一个二进制数,1
在第 n
位,其他位置均为零。要找出其中几个OR
-ed 的值,请编写一个二进制数,其中 1 的位置对应于在其定义中1
移动的位置数,并将该数字转换为十进制表示。
例如
NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
在位置 1
(纪元(、2
(年(、3
(月(和4
(日(中有一个,在所有剩余位置中都有零;位置从右边开始编号为零。它看起来像这样:
Position: 76543210
--------
Bit value: 00011110
二进制表示中的此00011110
在十进制表示中30
。
使用按位移位操作(wiki(来生成值,每个值在用于存储枚举值的"int"中仅设置一个位。通过执行此操作,您可以将值放在一起 OR(按位运算(,并且仍然能够分辨设置了哪些选项。
将preservedComponents
视为实际数字确实有意义,但并不明显,因为它的意思是一组指定格式/掩码的选定位。
当你写(1 << k)
时,你得到的只有第k位(从右边开始,从0开始(位被打开。如果写入(1 << a) | (1 << b)
则只会设置第 a 位和第 b 位。
例如,当您获得 124 时,您正在处理二进制数 1111100。这意味着您以这种方式将数字组合在一起(OR 运算符(
(1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (i << 6)
我不知道这对您的符号名称意味着什么,因为您似乎复制了错误的枚举。但我相信你明白了!:)
|
是按位的 OR 运算符。它采用两个长度相等的位模式,并对每对相应位执行逻辑包含 OR 运算。所以简单地说,它需要NSYearCalendarUnit,NSMonthCalendarUnit等并执行OR操作,从而产生124
和30
。这是将标志组合作为参数传递的非常常见的方式。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- C++ostream:没有运算符匹配<<&应在'&'代币
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 如何过载<<用于YAML::Emitter的运算符,以序列化包含另一个自定义类的向量的自定义类
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 当运算符<存在时,为什么要定义 LT?
- log4cxx访问异常,使用<<运算符和宏
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多