繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM