我已经在各种线程中看到了这两种符号,我想知道哪个是正确的? 或者,没有功能差异吗?
return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskPortraitUpsideDown;
或
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
答案 0 :(得分:2)
为了组合位掩码标志,它们几乎相同。你有:
0 + 0 = 0
0 | 0 = 0
0 + 1 = 1
0 | 1 = 1
1 + 0 = 1
1 | 0 = 1
然而,当你这样做时,它们会有所不同:
1 + 1 = 0 // and 1 goes to higher bit
1 | 1 = 1
你可以拥有' 1 + 1' case,当你组合相同的标志。它可能会错误地发生,当你修改现有的掩码,或者当你做一些不那么简单的事情时,比如你通过调用其他方法得到那些标志,然后你将它们累积在一些变量中,并且可以多次获得相同的标志。
在这种情况下,只有|
会给出正确的结果,所以我说最好养成一直使用|
的习惯。
它还可以使您的代码更易被他人阅读。
答案 1 :(得分:2)
正如其他人所说,|
是用于位域的正确运算符。
虽然其他运算符可能会起作用并产生类似的结果,但使用它们在语义上是错误的,并且会让其他程序员在阅读代码时感到困惑。
使用+
(或^
在这种情况下具有类似效果)只是混淆了含义。在代码审查中,我会拒绝它。
答案 2 :(得分:0)
在这种特殊情况下它们都具有相同的结果,但|
是首选,因为对于可能算术但通常无意义的位域,它是更正确的算子。
例如,如果您在变量中具有接口方向,并且要启用或禁用特定值,则使用+
可能会导致意外行为。
UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
// some other code ...
// Now I want to (incorrectly!) enable portrait, without checking it first
mask = mask + UIInterfaceOrientationMaskPortrait;
// mask now counterintuitively == UIInterfaceOrientationMaskPortraitUpsideDown
如果您是用户|
,则可以确保您在位字段上正常运行:
UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
// ...
// Now I want to (correctly!) enable portrait, without checking it first
mask = mask | UIInterfaceOrientationMaskPortrait; // mask is what you would expect it to be.