Java 这个符号到底是什么意思|=
|= 我很想了解这个操作员, 我见过在Java中设置标志时使用这种符号 例如:Java 这个符号到底是什么意思|=,java,android,bit-manipulation,flags,Java,Android,Bit Manipulation,Flags,|= 我很想了解这个操作员, 我见过在Java中设置标志时使用这种符号 例如: notification.flags |= Notification.FLAG_AUTO_CANCEL; 它是否执行某种位操作 这个标记到底是做什么的 还有其他类似的众所周知的迹象吗 相当于 notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL; 其中,|是逐位OR运算符,它将两个或两个变量逐位运算 这是众所周知的。还有+=
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
其中,|
是逐位OR运算符,它将两个或两个变量逐位运算
这是众所周知的。还有+=
,-=
,*=
,/=
,%=
,&=
,^=
它是否执行某种位操作
对。它将右侧操作数“或”转换为左侧操作数
这个标记到底是做什么的
这是一个与OR结合的赋值
还有其他像这样众所周知的迹象吗
有很多:
+=
,-=
,*=
,/=
,%=
,&=
,等等。它们统称为复合赋值运算符 此语法在C/C++和其他语言中也可用。它是位OR,与以下内容相同:
notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
i = i + 5;
与其他运算符类似,如加法、减法等。例如:
i += 5;
同:
notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
i = i + 5;
它被称为按位or运算符。比如说,
5 = 0000 0101
2 = 0000 0010
5 | 2 = 0000 0111
= 14
因此,当同一个选项可以使用多个值时,使用此概念
作为一个例子,考虑一个等于一个的变量标志。
int flags = 1;
现在,如果将标志值4与按位or相加
flags |= 4; // 0
您可以确定是否对具有按位and的标志应用了4
if (flags & 4 == 4) // returns true
如果该标志已应用于标志,则按位和返回标志。这样我们就可以使用按位and&按位or
希望这有帮助
(1) 它是否执行某种位操作
如果对数值操作数使用|
,则为是;如果对布尔操作数使用,则为逻辑(非短路)或。范例
逻辑OR:假设1
表示true
和0
false
+---+---+-------+
| p | q | (p|q) |
+---+---+-------+
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
+---+---+-------+
按位OR将执行与布尔运算类似的操作,但将使用相应的位
decimal binary
6 = 00110
3 = 00011
OR -------------
00111
(2) 这个标记到底是做什么的
x |=y
与x=x | y
相同,因此它将计算x | y
并将其存储在x
中
(3) 还有其他类似的众所周知的迹象吗
是的,每个算术、按位或位移位运算符都可以这样使用:+=
-=
*=
/=
%=
^=
>
以下是有关在中使用|=
的一些附加信息
notification.flags |= Notification.FLAG_AUTO_CANCEL;
假设我们有五个属性
Property1
Property2
Property3
Property4
Property5
我们可以使用数字的最后五位来表示我们有(1)或没有(0)某些属性的情况
...00xxxxx
│││││
││││└─ flag for Property1
│││└── flag for Property2
││└─── flag for Property3
│└──── flag for Property4
└───── flag for Property5
现在,假设我们只想使用属性1、2和4。为此,我们必须将索引为0、1和3的位设置为值1,如
...0001101
│││││
││││└─ (1) has Property1
│││└── (0) no Property2
││└─── (1) has Property3
│└──── (1) has Property4
└───── (0) no Property5
换句话说,我们必须生产13号(**1***8+**1***4+**0***2+**1***1)。我们可以使用|
或按位运算符8 | 4 | 1
来实现这一点,因为
8 = ...001000
4 = ...000100
1 = ...000001
OR -------------
13 = ...001101
但为了避免这种情况,我们可以创建一些常量来表示位世界中的属性。所以我们可以创造
public class MyProperties {
//...
public static final int PROPERTY_1 = 0b0000_0001; // = 1
public static final int PROPERTY_2 = 0b0000_0010; // = 2
public static final int PROPERTY_3 = 0b0000_0100; // = 4
public static final int PROPERTY_4 = 0b0000_1000; // = 8
public static final int PROPERTY_5 = 0b0001_0000; // = 16
//...
//rest of code: methods, constructors, other fields
}
以后像这样使用它
int context = Properties.PROPERTY_1|Properties.PROPERTY_2|Properties.PROPERTY_4
这比int context=8 | 4 | 1
更具可读性
现在,如果我们想改变我们的上下文,让我们假设addPROPERTY\u3
我们可以使用
context = context | Properties.PROPERTY_3;
或基于复合赋值运算符的较短版本
context |= Properties.PROPERTY_3;
哪一个可以做这个计算
context = 000...00001101
PROPERTY_3 = 000...00000010
OR ------------------------
000...00001111
(将PROPERTY_3
的值添加到context
和使用按位或
之间的主要区别在于,当context
已经将PROPERTY_3
设置为1
时,或者不会影响它)
现在,如果您看一看,在通知
类中使用了使用单个位作为属性标志的想法,其中FLAG\u AUTO\u CANCEL
常量的值为16
(0x010
十六进制,0b0001\u 0000
二进制)。已编辑。希望有足够的关键字用于网上冲浪。它是按位或逻辑的,取决于操作数类型。第一行之上和第二行之后的所有内容都是不相关的绒毛。@EJP希望现在更好。我不会说它不相关,当然,他们回答了我提出的许多问题。@Campiador似乎在我编辑之前,这个答案与实际提出的问题几乎没有什么联系,因此EJP的观点很有道理(因此没有任何不愉快的感觉)。因为这不仅对问题的作者如此,对其他可能来这里学习的人也是如此,所以答案应该是回答问题,而不仅仅是提供额外的信息。现在应该更好了。它是按位或逻辑的,取决于操作数类型。