常量的按位或
Posted
技术标签:
【中文标题】常量的按位或【英文标题】:Bitwise OR of constants 【发布时间】:2011-02-25 13:27:36 【问题描述】:在阅读一些文档 here 时,我遇到了这个:
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
我不知道这是如何工作的。我阅读了 C 中的按位运算符,但我不明白如何将三个(或更多!)常量放入一个 int 中,然后能够以某种方式从 int 中提取它们?进一步挖掘文档,我还发现了这个,这可能是相关的:
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),
CFCalendarUnit;
(1 << 3)
语句/变量如何工作?如果这是微不足道的,我很抱歉,但有人可以通过解释或发布一个好的解释的链接来启发我吗?
【问题讨论】:
看起来像objective-c?这是错误标记吗? @SoapBox:例子确实是取自Cocoa,但确实是直C。 第二行代码不是 C,绝对不是。 @Soapbox:不过,第二行确实与问题无关。 【参考方案1】:如果您查看二进制数字,每个数字要么打开 (1
) 要么关闭 (0
)。
您可以使用按位运算符有效地设置或询问各个位,以查看它们是否已设置。
取 8 位值 156。二进制是10011100
。
设置的位对应于位7
、4
、3
和2
(值128
、16
、8
、4
)。你可以很容易地用1 << (position)
计算这些值。所以,1 << 7
= 128
。
【讨论】:
【参考方案2】:基本上,常量只用一位表示,所以如果你有一个 32 位整数,你可以在其中放入 32 个常量。你的常数必须是 2 的幂,所以它们只需要一个“set”位来表示。
例如:
#define CONSTANT_1 0x01 // 0001 in binary
#define CONSTANT_2 0x02 // 0010 in binary
#define CONSTANT_3 0x04 // 0100 in binary
那你就可以了
int options = CONSTANT_1 | CONSTANT_3; // will have 0101 in binary.
如您所见,每一位都代表特定的常数。因此,您可以在代码中进行二进制 AND 并测试每个常量是否存在,例如:
if (options & CONSTANT_3)
// CONSTANT_3 is set
我建议您阅读有关二进制操作的内容(它们的工作方式类似于逻辑运算符,但在位级别),如果您深入了解这些内容,它将使您成为一名更好的程序员。
干杯。
【讨论】:
【参考方案3】:<<
是左移运算符,它将第一个操作数的位左移右操作数中指定的位置数(从右移到零位)。
在您的枚举中,您最终会得到 eacg 的不同位设置为 1 的值,因此当您构造类似 unitDate
的内容时,您可以稍后使用 &
运算符找出它包含哪些标志,例如unitDate & NSMonthCalendarUnit == NSMonthCalendarUnit
将是真的。
【讨论】:
【参考方案4】:1 << y
和2 to the power of y
基本是一回事
更一般地说,x << y
与 x multiplied by 2 to the power of y
相同。
在二进制中x << y
表示将x
的所有位向左移动y
位,在移动位的位置添加零:
00010 << 2 = 01000
所以:
1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
...
【讨论】:
【参考方案5】:数字1表示为000000000000000000000000000000001 (1
【讨论】:
以上是关于常量的按位或的主要内容,如果未能解决你的问题,请参考以下文章
python中的按位与 +按位或+ 按位反+异或运算 +左移+右移