[英]Bit comparation macro failing on 32bit OS
我有一个财产:
@property(nonatomic) unsigned long availableTypes;
availableTypes
值为481
== 0001 1110 0001
。
我需要知道哪些位是开/关。 所以我有一个宏:
#define isBitAtIndexOne(number, bit) (BOOL)(number & (1 << bit))
当我尝试获取位的值时,对于位0-7来说一切正常。 但是,当我尝试第8位时:
BOOL typeAvailable = isBitAtIndexOne(availableTypes, 8);
在64bit上,我收到YES
(正确的值),在32bit上我收到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
而当您超出第7位时,则超出了它可以表示的范围。
尝试:
#define isBitAtIndexOne(number, bit) ((number & (1 << bit)) != 0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.