位比较宏在32位操作系统上失败

时间:2015-09-18 09:45:39

标签: ios objective-c 64-bit bit-manipulation

我有一个属性:

- (void)keyboardDidShow: (NSNotification *) notifyKeyBoardShow{
    // key board is closed
}

- (void)keyboardDidHide: (NSNotification *) notifyKeyBoardHide{
    // key board is opened
}

@property(nonatomic) unsigned long availableTypes; 的值为availableTypes == 481

我需要知道哪些位是打开/关闭的。所以我有一个宏:

0001 1110 0001

当我尝试获取位的值时,一切都在0-7位正常工作。但是,当我尝试第8位时:

#define isBitAtIndexOne(number, bit)       (BOOL)(number & (1 << bit))

在64位我收到BOOL typeAvailable = isBitAtIndexOne(availableTypes, 8); (正确值),在32位我收到YES(无效值,应为NO)。

我不明白为什么会削减更高的价值。值为YES,因此它应该能够存储第8位。

- BTW -

我还认为宏正在转换值并削减顶部位,所以我尝试使用内联函数:

unsigned long

但它根本没用。

1 个答案:

答案 0 :(得分:0)

我认为这与我怀疑BOOL时投射到sizeof(BOOL) == 1有关,当你超越第7位时,你的范围超出了它的范围。

尝试:

#define isBitAtIndexOne(number, bit) ((number & (1 << bit)) != 0)