4

我在应用程序源代码中找到了这一行,但我无法弄清楚两个标志之间的按位或包含运算符“ | ”的含义。

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

我也不明白该运算符|=在以下行中的含义:

notification.flags |= Notification.FLAG_AUTO_CANCEL;

有人可以帮助我。

4

6 回答 6

7

我已经开始回答而没有其他人回答,所以我决定无论如何都要完成它......

管道和&符号分别| and &执行ORAND操作。

您将习惯于看到||and &&,它执行布尔逻辑ORand AND,并且单个的使用| or &是按位运算。

如果查看标志文档,clear_top 的标志是 0x04000000,single_top 是 0x20000000。

因此,您正在执行的操作是:0x04000000 OR 0x20000000 = 0x24000000

它设置了使用两个所需标志的意图所需的位。

运算符是的a |= b重载等价物a = a | b,类似于+=, --or的用法++,您应该习惯于在别处看到它

于 2013-07-05T10:31:00.390 回答
2

一个 | b 是 a 和 b 的按位或。

它的按位或赋值

a1 |= a2;

简称:

a1 = a1 | a2;

|= 与 += 的读取方式相同。

于 2013-07-05T10:26:46.907 回答
2

例如,假设 FLAG_ACTIVITY_CLEAR_TOP 为 2,FLAG_ACTIVITY_SINGLE_TOP 为 4。因此在二进制中,十进制值 2 的表示将是 0000000010,值 4 的表示将是 00000100。这两个值之间的二进制或运算将给出值 6:00000110( 2 和 4 上的 on 位都打开)。对吸吮常量使用两个值的幂将确保只有唯一值会在 th 位之后出现,或者:

例如:1 是 00000001 2 是 00000010 4 是 00000100 8 是 00001000 16 是 00010000 .....

如果您以这种方式设置标志 - 解码原始标志非常容易:只需对原始标志执行按位与运算,如果它为零,则标志不存在 - 如果它是标志本身 - 那么标志是向上的。

例如:让我们检查标志 SOME_FLAG 的 000011000 - 并且假设该示例的值是 8 - 00001000。在按位和运算之后:00011000 和 00001000 - 我们将得到 00001000 ,与其他东西(即不包括标志 SOME_FLAG - 与任何其他具有 2 值的标志一样)将返回 0。

于 2013-07-05T10:29:40.567 回答
1

这是一样的notification.flags = (notification.flags | Notification.FLAG_AUTO_CANCEL);

参看。a += b相当于a = (a + b);

为了清楚起见,我使用了多余的括号。

于 2013-07-05T10:25:42.863 回答
1

据我所知,这些是位运算符。

正如 Bathsheba 所写,它等于(notification.flags | Notification.FLAG_AUTO_CANCEL);

这是一个合乎逻辑的或,有关信息,请参见此处:Oracle.com

关于或在Wikipedia上的信息。

于 2013-07-05T10:26:59.553 回答
1

如果您查看这些标志,您会发现它们都是 2 的幂。这意味着恰好有一位设置为 1,因此按位执行或在这种情况下仅意味着设置所有这些标志。

于 2013-07-05T10:28:52.830 回答