“| =” Ne anlama geliyor? (boru eşit operatörü)


249

Google Arama ve Yığın Taşması'nı kullanarak arama yapmayı denedim, ancak sonuç göstermedi. Ben açık kaynak kodlu kütüphane kodunda gördüm:

Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;

"| =" ( pipe equal operator) Ne anlama geliyor?


4
pipe equal operatorBu soruya benzer bir şey veya konuyla ilgili başka bir belge eklemenin kullanıcıların aramalarına yardımcı olup olmadığını merak ediyorum .
— Denys Séguret

10
@EJP siz bu dokümanlar hakkında konuşuyorsunuz . Belgelerin bunun kullanımı ile ilgili belgelerinden yoksun olduğunu açıkça göstermektedir .
— 13:34

36
Boru eşit olarak adlandırıldığını bilmiyorsanız, birine sormadan aramak gerçekten zor.
— ataulm

@ataulm, vertical barsonunda beni buraya getiren bir terim bulmak için biraz zaman harcadı .
— ruuter

Yanıtlar:


323

|=ile aynı şekilde okur +=.

notification.defaults |= Notification.DEFAULT_SOUND;

aynıdır

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

|bit-bilge VEYA operatörü nerede .

Tüm operatörlere burada referans verilmiştir .

Bit bilge bir operatör kullanılır, çünkü bu sabitler sıkça olduğu gibi bir int'in bayrak taşımasını sağlar.

Eğer varsa bakmak bu sabitleri de, onlar iki üssü olduğunuzu göreceksiniz:

public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary

Böylece bayrak eklemek için biraz akıllı VEYA kullanabilirsiniz

int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011

yani

myFlags |= DEFAULT_LIGHTS;

basitçe bir bayrak eklediğimiz anlamına gelir.

Ve simetrik olarak, bir bayrağın setini kullanarak test ediyoruz &:

boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;

2
Aynen j += 1;olduğu gibi j = j + 1;.
— David Schwartz

1
@ARS: (belki ben Java bir karşı örnek düşünemiyorum jolan volatile?) Ama buna söz alacağım.
— David Schwartz

6
Bkz @DavidSchwartz bu
— arshajii

2
boolean hasVibrate = DEFAULT_VIBRATE & myFlags;- Eğer gelen çevirebilir intiçin booleanJava böyle? Bu C için geçerli olurdu, ama Java olarak yazılması gerektiğini düşündümboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
— BlueRaja - Danny Pflughoeft

1
@DavidSchwartz Vay canına, bu karşılaştırma +=nihayetinde onu anlamak için hile yaptı. Teşekkürler!
— C4d

39

Sorunuz için zaten yeterli cevabınız var. Ama cevabım size |=ikili operatörler hakkında daha fazla yardımcı olabilir .

Bitsel işleçler için tablo yazıyorum :
Aşağıdakiler geçerlidir:

----------------------------------------------------------------------------------------
Operator   Description                                   Example
----------------------------------------------------------------------------------------
|=        bitwise inclusive OR and assignment operator   C |= 2 is same as C = C | 2
^=        bitwise exclusive OR and assignment operator   C ^= 2 is same as C = C ^ 2
&=        Bitwise AND assignment operator                C &= 2 is same as C = C & 2
<<=       Left shift AND assignment operator             C <<= 2 is same as C = C << 2
>>=       Right shift AND assignment operator            C >>= 2 is same as C = C >> 2  
----------------------------------------------------------------------------------------

tüm işleçlerin ikili işleç olduğunu unutmayın.

Ayrıca Not: (aşağıdaki noktalar için cevabımı eklemek istedim)

  • >>>Java'da bitsiz operatör olarak adlandırılan bitsel işleçtir
    ancak >>>=Java'da bir operatör değil. >>> = operatör

  • ~bitsel tamamlayıcı bitler 0 to 1 and 1 to 0(Tekli operatör), ancak ~=bir operatör değil.

  • Buna ek olarak, !Mantıksal DEĞİL İşleci denir, ancak !=iki işlenenin değerinin eşit olup olmadığını denetler, değerler eşit değilse koşul doğru olur. örn (A != B) is true. gibi olduğu A=!Baracı ise Bbir trueo Ahaline false(ve eğer Bolduğu falsesonra Aolmak true).

yan not: |boru denmez, onun yerine OR denir, boru kabuk terminolojisi bir süreçten diğerine aktarımdır ..


9
Kabuk teriminin geldiği karakterin adı "boru" olduğu izlenimindeydim. Ancak Wikipedia'ya bakıldığında buna aslında "dikey çubuk" denir ve "boru" kabuk komutlarına özgüdür. Sadece bu yan notu eklediğiniz için teşekkür etmek istedim!
— Caleb Brinkman

18

|=Groovy ne yapar bir cevap arıyordum ve yukarıdaki cevaplar doğru olmasına rağmen onlar bana bakıyordum belirli bir kod parçası anlamak yardımcı olmadı.

Özellikle, bir boole değişkenine uygulandığında "| =" sağ tarafta doğru bir ifadeyle ilk kez karşılaştığında bunu TRUE olarak ayarlayacak ve tüm | = sonraki çağrılar için TRUE değerini TUTACAKTIR. Bir mandal gibi.

İşte bunun basitleştirilmiş bir örneği:

groovy> boolean result  
groovy> //------------ 
groovy> println result           //<-- False by default
groovy> println result |= false 
groovy> println result |= true   //<-- set to True and latched on to it
groovy> println result |= false 

Çıktı:

false
false
true
true

Düzenleme : Bu neden yararlı?

Çeşitli nesnelerde bir şeyin değişip değişmediğini bilmek istediğiniz bir durumu düşünün ve varsa değişikliklerden bazılarını bilgilendirin. Yani, bir hasChangesboolean kurar ve onu |= diff (a,b)ve sonra |= dif(b,c)vb. Ayarlarsınız. İşte kısa bir örnek:

groovy> boolean hasChanges, a, b, c, d 
groovy> diff = {x,y -> x!=y}  
groovy> hasChanges |= diff(a,b) 
groovy> hasChanges |= diff(b,c) 
groovy> hasChanges |= diff(true,false) 
groovy> hasChanges |= diff(c,d) 
groovy> hasChanges 

Result: true

10
Evet, aynısı Java için de geçerli. Ama buna değer böyle VEYA operasyon belirterek y|=exprolduğu kısa devre değil (aksine y = y || expryani) exprher zaman değerlendirdi. Bu ilk kez benim için belirgin değildi :) o değiştirilmesini üstlenmeden önce nota önemlidir Yani y|=expr↔ y=y||xolduğunu anlama sahip değil durumda expraslında yan etkileri vardır.
— NIA

1
Ve, bu durumu göz önünde olan sizin durumda olan hasChangeso olurdu muhtemelen tercih daha iyi y=y||x, herhangi bir değişiklik bulduğunda aslında zaten cevabı biliyorum çünkü susequent diffs yapmak için gerekli olmadığından, kısa ciruit gelen yararına formu. (Özellikle karşılaştırılan nesneler karmaşık olduğunda ve diffonları bunlardan
— ayırmak

@NIA Yukarı oy için teşekkürler. Evet, kısa devre konusundaki görüşünüze katılıyorum.
— dbrin

2
@FranklinYu elbette uygulama detayı değil. Kısa devre olmama özelliği, sadece tuhaflık olmadığı için başvuruda bulunduğunuz yerde özellikle belirtilmez - çoğu operatör için varsayılan ve normal davranıştır. Tuhaflık aslında ve kısa devre birliğidir ||ve &&karşılık gelen 15.23 ve 15.24 bölümlerinde bu gerçek açıkça beyan edilir ve bu fark |ve &vurgulanır.
— NIA

2
@FranklinYu Bu yüzden tekrar aşağıdaki bölümde başvurulan bu konuda bir şeyler söylemek gerek yoktu bence (15.26.2 "compund atama operatörleri") compond atamaları hiçbir vardır (non-kısa devre basitçe hep sırf ||=ve &&=hangi olurdu operatörler kuralı çiğnemek ve özel bir söz gerektirir).
— NIA

13

Bunun kısalması:

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

Ve |biraz akıllıca VEYA.



3

Not: || = mevcut değil. (mantıksal veya)

y= y || expr; // expr is NOT evaluated if y==true

veya

y = expr ? true : y;  // expr is always evaluated.

4
Oldukça eksiksiz değil: hala y |= exprbooleans ile kullanabilirsiniz ve kısa curtuit olmadığıy önemli notuyla varyantlarınızla aynı sonucu verir , yani ekspres her zaman değerlendirilir, hattay==true
— NIA
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.