常量的按位或

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 &lt;&lt; 3) 语句/变量如何工作?如果这是微不足道的,我很抱歉,但有人可以通过解释或发布一个好的解释的链接来启发我吗?

【问题讨论】:

看起来像objective-c?这是错误标记吗? @SoapBox:例子确实是取自Cocoa,但确实是直C。 第二行代码不是 C,绝对不是。 @Soapbox:不过,第二行确实与问题无关。 【参考方案1】:

如果您查看二进制数字,每个数字要么打开 (1) 要么关闭 (0)。

您可以使用按位运算符有效地设置或询问各个位,以查看它们是否已设置。

取 8 位值 156。二进制是10011100

设置的位对应于位7432(值1281684)。你可以很容易地用1 &lt;&lt; (position) 计算这些值。所以,1 &lt;&lt; 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】:

&lt;&lt; 是左移运算符,它将第一个操作数的位左移右操作数中指定的位置数(从右移到零位)。

在您的枚举中,您最终会得到 eacg 的不同位设置为 1 的值,因此当您构造类似 unitDate 的内容时,您可以稍后使用 &amp; 运算符找出它包含哪些标志,例如unitDate &amp; NSMonthCalendarUnit == NSMonthCalendarUnit 将是真的。

【讨论】:

【参考方案4】:

1 &lt;&lt; y2 to the power of y基本是一回事

更一般地说,x &lt;&lt; yx multiplied by 2 to the power of y 相同。

在二进制中x &lt;&lt; y 表示将x 的所有位向左移动y 位,在移动位的位置添加零:

00010 &lt;&lt; 2 = 01000

所以:

1 << 1 = 2
1 << 2 = 4
1 << 3 = 8
...

【讨论】:

【参考方案5】:

数字1表示为000000000000000000000000000000001 (1

【讨论】:

以上是关于常量的按位或的主要内容,如果未能解决你的问题,请参考以下文章

结果之间的按位或

python中的按位与 +按位或+ 按位反+异或运算 +左移+右移

Swift学习之位移枚举的按位或运算

C语言里的按位异或运算符

子序列的按位或 Bitwise ORs of Subarrays

c语言的按位运算符怎么操作!?