为什么一元位反转运算符不会反转BOOL的值?

时间:2014-06-03 16:25:24

标签: objective-c boolean bit-manipulation

我希望每次检测到点击时都会反转BOOL的值。 BOOL的默认值为NO,我第一次点按它会将其反转为YES。在随后的点击中,值保持为YES

@property(nonatomic, assign) BOOL isDayOrNight; //property in timeDayChart object.

self.timeDayChart.isDayOrNight = ~self.timeDayChart.isDayOrNight; //This is done in a VC. 

我不得不改变它:

self.timeDayChart.isDayOrNight = !self.timeDayChart.isDayOrNight;

实现我想要的结果。我想知道为什么~没有按预期工作。

4 个答案:

答案 0 :(得分:2)

BOOL被定义为objc.h中的签名字符:

typedef signed char     BOOL; 

和YES和NO的定义如下:

#define YES             (BOOL)1
#define NO              (BOOL)0

所以~YES是-2,这与NO不同。

答案 1 :(得分:2)

在(Objective-)C(++)中,当需要布尔值时,例如在if中或作为&&的操作数,实际取一个整数值并将0解释为false和非零为真。逻辑,关系和相等运算符都返回整数,使用0表示false,使用1表示true。

Objective-C' BOOLsigned char的同义词,它是整数类型,而NOYES分别定义为0和1。

正确状态~是位反转运算符。如果你反转任何包含0&1和1的整数,结果也会这样做。任何包含1位的值都被视为true,并且反转除了所有1之外的任何此类值都会生成一个至少有一个1位的值,该值也被解释为true。

如果你从0开始,那么重复的反转应该全部为1,全部为0,全部为1 - 这是真,假,真等。(但是是,否,是等等)。因此,如果你从0开始,那么要么你并不总是使用反演,要么你明确地测试YES而不是真。

然而,你应该使用的是! - 逻辑否定 - 它将0映射到1而非0映射到0,因此处理" true"正确的值不是1。

HTH

答案 2 :(得分:0)

找一本关于C语言的书。检查它对〜运算符的说法和!运营商。 〜反转整数中的所有位,BOOL定义为整数类型。因此NO =所有位0将被更改为所有设置的位,这与YES不同,并且YES =除了最后一位= 1之外的所有位将被更改为除最后一位= 0之外的所有位设置。

答案 3 :(得分:0)

最好使用这个习惯用来切换BOOL值:

self.timeDayChart.isDay = self.timeDayChart.isDay ? NO : YES;

(我故意改变了你的财产的命名)