Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “这两个运算符”是什么意思|=&引用;及|&引用;_Java_Android - Fatal编程技术网

Java “这两个运算符”是什么意思|=&引用;及|&引用;

Java “这两个运算符”是什么意思|=&引用;及|&引用;,java,android,Java,Android,我在应用程序源代码中找到了这一行,但我无法理解两个标志之间的按位或包含运算符“|”的含义 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 我也不理解以下行中此运算符的含义: notification.flags |= Notification.FLAG_AUTO_CANCEL; 有人可以帮我一下。这与notification.flags=(notifica

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

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)相同


cf.
a+=b
相当于
a=(a+b)


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

a | b是按位的,或者是a和b的

它是按位或的赋值

a1 |= a2;
缩写为:

a1 = a1 | a2;

|=的读取方式与+=。

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

正如芭丝谢芭所写,它等于
(notification.flags | notification.FLAG_AUTO_CANCEL)

这是一个逻辑or,有关信息,请参见此处:


关于或位于的信息。

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

例如,让我们假设标志活动清除顶部为2,标志活动单一顶部为4。 因此,在二进制中,十进制值2的表示为00000000 10,值4的表示为00000100。这两个值之间的二进制或运算将给出值6:00000110(2和4上的on位均为on)。对吸吮常量使用两个值的幂将确保在按位或之后只会出现唯一值:

例如:1是0000000 1 2是000000 10 4是00000 100 8是00001016是00010000

如果以这种方式设置标志-解码原始标志非常容易:只需对原始标志执行位AND操作,如果零,则标志不存在-如果是标志本身-则标志向上


例如:让我们检查000011000中的标志SOME_flag,假设示例中的porpuse的值为8-000011000。按位and运算后:00011000&000011000-我们将得到000011000,与其他标志(不包括标志SOME_标志-与任何其他2次幂的标志一样)进行ANDing将返回0。

我在没有其他人回答的情况下开始回答,所以我决定无论如何完成它

管道和符号分别执行
操作

您将习惯于看到
|
&
,它们执行布尔逻辑
,使用单个
或&
是一种按位操作

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

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

它在意图中设置所需位以使用两个所需标志


a |=b
运算符是重载的等价于
a=a | b
,类似于
+=
--
+
的用法,您应该习惯于在其他地方看到它

与notification.flags=notification.flags | notification.FLAG\u AUTO\u CANCEL;这只是一个简短的形式。@rene-Link,除了
通知。flags
只计算一次。请参阅教程:人们喜欢反复询问(和回答)的问题。“a+=b相当于a=(a+b);”?尝试
字节a=100,b=100@johnchen902;对不起,我没有听懂。
a+=b
相当于
a=(a的类型)(a+b)
。因此,如果
a
b
都是
byte
(或类似的东西),
a=(a+b)引发编译错误,而
a+=b
没有。谢谢,这就是我要找的。我已经读过android文档,但我不明白,但现在更好了:我做了错误的操作,我认为0x04000000 | 0x20000000=0x60000000,所以我没有注意到4 x的位置,编辑(编辑之前我回答了| |和|-这不是问题)非常感谢你的帮助