"| ="은 무슨 뜻입니까? (파이프 등 연산자)


249

Google 검색 및 스택 오버플로를 사용하여 검색을 시도했지만 결과가 표시되지 않았습니다. 오픈 소스 라이브러리 코드에서 이것을 보았습니다.

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

"| ="( pipe equal operator)은 무슨 뜻입니까?


4
pipe equal operator이 질문이나 주제에 대한 다른 문서를 추가해도 사람들이 검색하는 데 도움이되지 않는지 궁금합니다 .
Denys Séguret

10
@ EJP 당신이 문서 에 대해 얘기하고 있습니다. 그것은 문서에 이것의 사용 에 대한 문서가 부족하다는 것을 분명히 합니다.
wtsang02

36
파이프 평등이라는 것을 알지 못하면 누군가에게 묻지 않고 검색하기가 정말 어렵습니다.
ataulm

@ataulm, 실제로, vertical bar나를 마침내 여기로 이끄는 용어를 생각해 내기 위해 인터넷 검색에 시간을 보냈습니다 .
ruuter

답변:


323

|=와 같은 방식으로 읽습니다 +=.

notification.defaults |= Notification.DEFAULT_SOUND;

와 같다

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

|비트 OR 연산자는 어디에 있습니까 ?

모든 연산자가 여기 에 참조 됩니다 .

비트 단위 연산자는 빈번하게 이러한 상수로 인해 int가 플래그를 전달할 수 있기 때문에 사용됩니다.

이 상수 를 보면 두 가지의 힘을가집니다.

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

따라서 비트 단위 OR을 사용하여 플래그를 추가 할 수 있습니다

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

그래서

myFlags |= DEFAULT_LIGHTS;

단순히 플래그를 추가한다는 의미입니다.

대칭 적으로 플래그를 테스트하여 &다음을 사용합니다 .

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

2
마찬가지로는 j += 1;동일하다 j = j + 1;.
David Schwartz

1
@ ARS : Java의 반례를 생각할 수 없습니다 (어쩌면 j 있다 volatile?),하지만 난 그것을 위해 당신의 말을 것이다.
David Schwartz

6
참조 @DavidSchwartz
arshajii

2
boolean hasVibrate = DEFAULT_VIBRATE & myFlags;- 당신은 번역 할 수 있습니다 intboolean자바처럼? C에서는 유효하지만 Java에서는 다음과 같이 작성해야한다고 생각했습니다.boolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
BlueRaja-Danny Pflughoeft

1
@DavidSchwartz 와우, 그 비교는 +=마침내 그것을 이해하기위한 트릭을 만들었습니다. 감사!
C4d

39

귀하의 질문에 대한 답변이 이미 충분합니다. 그러나 내 대답 |=이 이진 연산자의 종류에 대해 더 도움이 될 수 있습니다 .

비트 연산자에 대한 테이블을 작성 중입니다 .
다음은 유효합니다.

----------------------------------------------------------------------------------------
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  
----------------------------------------------------------------------------------------

모든 연산자는 이진 연산자입니다.

또한 참고 : (아래 포인트에 대한 답변을 추가하고 싶었습니다)

  • >>>부호없는 시프트 라고하는 Java의 비트 연산자
    그러나 >>>= 하지 자바의 연산자를 사용합니다. >>> = 연산자

  • ~ 비트 단위 보수 비트입니다. 0 to 1 and 1 to 0 (단항 연산자)이지만 ~=연산자는 아닙니다.

  • 또한 !논리 NOT 연산자라고하지만 !=두 피연산자의 값이 같은지 여부를 확인하고 값이 같지 않으면 조건이 참이됩니다. 예 (A != B) is true. 여기서 같은 A=!B의미하는 경우 B된다 trueA하게 false(그리고 경우 B이다 false그때A 하게 true).

참고 : |파이프라고하지 않고 OR이라고하고 파이프는 쉘 용어로 한 프로세스를 다음 프로세스로 옮깁니다.


9
나는 "파이프"가 캐릭터의 이름이라는 느낌을 받았다. 그러나 Wikipedia를 보면 실제로 "수직 막대"라고하며 "파이프"는 쉘 명령에만 해당됩니다. 사이드 노트를 추가해 주셔서 감사합니다.
Caleb Brinkman

18

나는 무엇에 대한 답을 찾고 있었다 |=Groovy의 기능 있었지만 위의 답변이 옳았지만 내가보고있는 특정 코드를 이해하는 데 도움이되지 않았습니다.

특히, 부울 변수 "| ="에 적용되면 오른쪽에서 처음식이 _ 생할 때 TRUE로 설정되고 모든 | = 후속 호출에 대해 참 값을 보유합니다. 래치처럼.

여기에 간단한 예가 있습니다.

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 

산출:

false
false
true
true

편집 : 왜 이것이 유용한가요?

다양한 객체에서 변경된 사항이 있는지 알고 싶은 경우 변경 사항을 알리십시오. 따라서 hasChanges부울을 설정 |= diff (a,b)한 다음 |= dif(b,c)등에 설정합니다 . 다음은 간단한 예입니다.

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
예, Java에서도 마찬가지입니다. 그러나 그러한 OR 연산 y|=expr이 (와 달리 ) 단락되지 않았다는 점에 주목할 가치가 있습니다. 이것은 처음으로 나에게 분명하지 않았다 : 그것은 그 교체를 리팩토링하기 전에주의하는 것이 중요하다 그래서 ↔ 입니다 의미와 일치하지 않는 경우에 실제로 부작용이있다. y = y || exprexpry|=expry=y||xexpr
NIA

1
그리고,이 점을 가지고 귀하의 경우hasChanges그것을하는 것 아마 선호하는 더 나은 y=y||x당신이 어떤 변화를 발견 할 때 실제로 당신은 이미 답을 알고 있기 때문에 susequent 차이점을 할 필요가 있지 않기 때문에, 짧은 ciruit에서 이익을 위해 양식을. (객체를 비교할 때 실제 상황에서 특히 중요하며 대상을 복잡하게 diff만드는 것은 그리 빠르지 않습니다)
NIA

@NIA 투표 해 주셔서 감사합니다. 예, 단락에 대한 귀하의 의견에 동의합니다.
dbrin

2
물론 @FranklinYu는 구현 세부 사항이 아닙니다. 비 단락은 특이성이 아니기 때문에 언급 한 장소에서 구체적으로 언급되지 않았으며 대부분의 운영자에게 기본적이고 정상적인 행동입니다. 특이성은 실제로 및의 짧은주기 ||이며 &&, 사양의 해당 섹션 15.2315.24 에서이 사실이 명확하게 선언되어 있으며,이 차이점 |과의 차이점 &이 강조되어 있습니다.
NIA

2
@FranklinYu 따라서 compond 할당이 항상 단락이 아닌 것이므로 (15.26.2 "Compund assignment operator") 섹션에서 아래에 대해 다시 말할 필요가 없다고 생각합니다 ( 아니오 ||=&&=연산자가 있습니다) 규칙을 어 기고 특별한 언급이 필요합니다).
NIA

13

이것은 단축입니다.

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

그리고 |비트 OR입니다.



3

참고 : || =가 존재하지 않습니다. (논리적 또는) 사용할 수 있습니다

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

또는

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

4
아주 완료되지 않음 : 당신은 여전히 사용할 수있는 y |= expr부울로 그것은에서 동일한 결과를 제공 y하는 중요한 메모와 함께 귀하의 변종 이 짧은 curtuit가 아닌 도의 경우, 항상 평가 될 수 EXPR 의미를,y==true
NIA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.