在objective-c中定义位掩码

时间:2015-06-14 19:32:53

标签: objective-c

我正在学习Objective-c,我无法理解什么是BitMasks,有人能帮我理解吗?而且我也不知道这个算子<<的功能是什么。

1 个答案:

答案 0 :(得分:1)

Objective C是C的存在,它使用相同的bitwise operators。让我们以UIRemoteNotificationType为例:

UIRemoteNotificationTypeNone    = 0,
UIRemoteNotificationTypeBadge   = 1 << 0,
UIRemoteNotificationTypeSound   = 1 << 1,
UIRemoteNotificationTypeAlert   = 1 << 2,
UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3,

<<是左移操作符,一旦你查看二进制形式,它的功能就很明显了:

1 << 0 = 1 (decimal) = 0000001 (binary)
1 << 1 = 2 (decimal) = 0000010 (binary)
1 << 2 = 4 (decimal) = 0000100 (binary)
1 << 3 = 8 (decimal) = 0001000 (binary)

它将特定模式(左操作数)向左移动,移位的“长度”由右操作数确定。它适用于1以外的其他数字; 3 << 2 = 12因为0000011(二进制)移位了两个位置是0001100.转换为正常数学,a << b = a * 2^b

此模式的具体用法是检查是否设置了某个选项非常容易。假设我希望我的应用程序发送带有徽章和警报的通知。我将值UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert传递给API,即

UIRemoteNotificationTypeBadge = 0000001
UIRemoteNotificationTypeAlert = 0000100
                        total = 0000101 |

(|是按位OR运算符;对于每个位,如果操作数的相应位中的一个或两个为1,则结果为1)。 然后,API可以检查徽章属性是否与&amp;操作者:

                        total = 0000101
UIRemoteNotificationTypeBadge = 0000001
                       result = 0000001 &

(&amp;是按位AND运算符;对于每个位,如果操作数的相应位都是1,则结果为1)。 结果为非零,因此存在徽章属性。让我们对声音属性做同样的事情:

                        total = 0000101
UIRemoteNotificationTypeSound = 0000010
                       result = 0000000 &

结果为零,因此不存在徽章属性。