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运算符,它将两个或两个变量逐位运算 这是众所周知的。还有+=

|=

我很想了解这个操作员, 我见过在Java中设置标志时使用这种符号

例如:

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
    更具可读性


    现在,如果我们想改变我们的上下文,让我们假设add
    PROPERTY\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的观点很有道理(因此没有任何不愉快的感觉)。因为这不仅对问题的作者如此,对其他可能来这里学习的人也是如此,所以答案应该是回答问题,而不仅仅是提供额外的信息。现在应该更好了。它是按位或逻辑的,取决于操作数类型。