“| =” 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|=expry=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.