我在应用程序源代码中找到了这一行,但我无法弄清楚两个标志之间的按位或包含运算符“ | ”的含义。
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
我也不明白该运算符|=在以下行中的含义:
notification.flags |= Notification.FLAG_AUTO_CANCEL;
有人可以帮助我。
我已经开始回答而没有其他人回答,所以我决定无论如何都要完成它......
管道和&符号分别| and &
执行OR
和AND
操作。
您将习惯于看到||
and &&
,它执行布尔逻辑OR
and AND
,并且单个的使用| or &
是按位运算。
如果查看标志文档,clear_top 的标志是 0x04000000,single_top 是 0x20000000。
因此,您正在执行的操作是:0x04000000 OR 0x20000000 = 0x24000000
它设置了使用两个所需标志的意图所需的位。
运算符是的a |= b
重载等价物a = a | b
,类似于+=
, --
or的用法++
,您应该习惯于在别处看到它
一个 | b 是 a 和 b 的按位或。
它的按位或赋值
a1 |= a2;
简称:
a1 = a1 | a2;
|= 与 += 的读取方式相同。
例如,假设 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。
这是一样的notification.flags = (notification.flags | Notification.FLAG_AUTO_CANCEL);
参看。a += b
相当于a = (a + b);
为了清楚起见,我使用了多余的括号。
据我所知,这些是位运算符。
正如 Bathsheba 所写,它等于(notification.flags | Notification.FLAG_AUTO_CANCEL);
这是一个合乎逻辑的或,有关信息,请参见此处:Oracle.com
关于或在Wikipedia上的信息。
如果您查看这些标志,您会发现它们都是 2 的幂。这意味着恰好有一位设置为 1,因此按位执行或在这种情况下仅意味着设置所有这些标志。