[java] “| =”은 무슨 뜻입니까? (파이프 등 연산자)

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

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

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



답변

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

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;


답변

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

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

----------------------------------------------------------------------------------------
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이라고하고 파이프는 쉘 용어로 한 프로세스를 다음 프로세스로 옮깁니다.


답변

나는 무엇에 대한 답을 찾고 있었다 |=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


답변

이것은 단축입니다.

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

그리고 |비트 OR입니다.


답변

|는 IS 비트 또는 오퍼레이터와 같은 것이 적용되고있다 +=.


답변

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

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

또는

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


답변