位比较宏在 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)
我有一个 属性:
@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)