位比较宏在 32 位上失败 OS

Bit comparation macro failing on 32bit OS

我有一个 属性:

@property(nonatomic) unsigned long availableTypes;

availableTypes的值为481 == 0001 1110 0001

我需要知道哪些位是 on/off。所以我有一个宏:

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

当我尝试获取位的值时,位 0-7 一切正常。然而,当我尝试第 8 位时:

BOOL typeAvailable = isBitAtIndexOne(availableTypes, 8);

在 64 位上我收到 YES(正确值),在 32 位上我收到 NO(无效值,应该是 YES)。

我不明白为什么要削减更高的价值。该值为 unsigned long 所以它应该能够存储第 8 位。

-- 顺便说一句 --

我还认为宏正在转换值并删除最高位,所以我尝试使用内联函数:

extern BOOL isBitAtIndexOne(unsigned long number, NSInteger bit);
inline BOOL isBitAtIndexOne(unsigned long number, NSInteger bit) {
    return (BOOL)(number & (1 << bit));
}

但一点用也没有。

我认为这与转换到 BOOL 有关,因为我怀疑 sizeof(BOOL) == 1 并且当您超出 bit-7 时,您超出了它可以表示的范围。

尝试:

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