这两个运算符"|="和"|"的含义是什么?

4

我在一个应用程序源代码中发现了这行代码,但是我无法理解两个标志之间的按位或包含运算符|的含义。

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

在下面这行代码中,我也不理解|=操作符的含义:

notification.flags |= Notification.FLAG_AUTO_CANCEL;

有人能帮我吗?


这两者是相同的,只是一种简写形式:notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL; - René Link
@RenéLink除了notification.flags只被评估一次。 - johnchen902
1
https://dev59.com/QGYq5IYBdhLWcg3wrSas - devnull
3
人们喜欢那些被反复提问和回答过的问题。 - devnull
可能是[what does |= (single pipe equal) and &=(single ampersand equal) mean]的重复问题。 - phuclv
显示剩余2条评论
6个回答

7
我已经开始回答了,因为没有其他人回答,所以我决定继续回答...
管道符号和&符号分别执行OR和AND操作。
您可能已经习惯了看到 || 和 && ,它们执行布尔逻辑OR和AND,而单个 | 或& 是位运算。
如果查看标志文档,则清除顶部的标志为0x04000000,而single_top的标志则为0x20000000。
因此,您正在执行的操作是: 0x04000000 OR 0x20000000 = 0x24000000
这将在意图中设置所需的位,以使用两个所需的标志。 a | = b 运算符是 a = a | b 的重载等效物,类似于其他地方可能已经习惯看到的 + = , - 或 ++ 。

谢谢,这就是我想要的。我已经阅读了Android文档,但是之前并没有理解,现在好多了 :p - anass
老实说,我做了错误的操作,我以为 0x04000000 | 0x20000000 = 0x60000000,所以我没有注意到 4 的位置 x)。 - anass

2
假设FLAG_ACTIVITY_CLEAR_TOP的值为2,FLAG_ACTIVITY_SINGLE_TOP的值为4。因此,在二进制中,表示值2的是0000000010,表示值4的是00000100。这两个值的二进制或操作将给出值6:00000110(2和4的位都为1)。使用二的幂值作为这些常量的值将确保在位或运算后仅产生唯一的值:
例如:1是00000001,2是00000010,4是00000100,8是00001000,16是00010000......
如果您以这种方式设置标志,那么解码原始标志非常容易:只需对原始标志执行按位与操作,如果结果为零,则该标志不存在-如果结果等于标志本身,则该标志存在。
例如:让我们检查标志SOME_FLAG的000011000,并假设其值为8-00001000。进行按位与操作后:00011000&00001000-我们将得到00001000,与其他某个东西进行AND操作(不包括标志SOME_FLAG-例如任何其他具有二的幂值的标志)将返回0。

抱歉,编辑过了(在编辑之前,我回答了关于||和|之间的区别,但那不是问题所在)。 - Eli Turchinsky

2

a | b是a和b按位或运算的结果。

它是按位或赋值操作。

a1 |= a2;

缩写意为:

a1 = a1 | a2;

|= 与 += 同义。


1

这与notification.flags = (notification.flags | Notification.FLAG_AUTO_CANCEL);相同。

参见a += b等价于a = (a + b);

这里我使用了多余的括号以提高清晰度。


"a += b等同于a =(a + b);"?请尝试 byte a = 100,b = 100; - johnchen902
@johnchen902;抱歉,我不明白你的意思。 - Bathsheba
a += b 相当于 a = (a+b) 的类型转换。因此,如果 ab 都是 byte 类型(或类似的类型),则 a = (a + b); 会引发编译错误,而 a += b 则不会。 - johnchen902

1
据我所知,这些是位运算符。
正如Bathsheba所写的那样,它等同于(notification.flags | Notification.FLAG_AUTO_CANCEL); 这是一个逻辑或,有关信息请参见此处:Oracle.com 有关或的信息,请参见Wikipedia

1
如果你看这些标志,你会发现它们都是2的幂。这意味着只有一个位被设置为1,因此在这种情况下执行按位或运算只是设置所有这些标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接