비트 연산자는 변수를 이동하고 비트 단위로 작동해야합니다. 정수, longs, char의 경우 이것은 의미가 있습니다. 이러한 변수는 크기에 따라 적용되는 값의 전체 범위를 포함 할 수 있습니다.
그러나 부울의 경우 부울에는 두 개의 값만 포함될 수 있습니다. 1 = 참 또는 0 = 거짓. 그러나 부울의 크기는 정의되지 않았습니다. 바이트만큼 크거나 조금 작을 수 있습니다.
부울에 비트 연산자를 사용하면 어떤 효과가 있습니까? JVM은 본질적으로 그것을 일반 논리 연산자로 변환하고 계속 진행합니까? 작업을 위해 부울을 단일 비트 엔티티로 취급합니까? 아니면 부울 크기와 함께 결과가 정의되지 않았습니까?
답변
연산자 &
,, ^
및 |
연산자는 피연산자가 기본 정수 유형 인 경우 비트 연산자입니다. 피연산자가 부울이고 후자의 경우 동작이 지정된 경우 논리 연산자입니다. 자세한 내용은 Java 언어 사양 의 섹션 15.22.2 를 참조하십시오.
답변
비트 연산자를 사용하면 단락 동작을 피할 수 있습니다.
boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();
경우 booleanExpression1()
들을 평가가 false
다음
booleanExpression2()
첫 번째 경우 및 평가되지 않는다
booleanExpression2()
(그리고 어떤 부작용이있을 수있다)이 되는 두 번째 경우에 평가,
답변
다른 답변으로 덮여 것 이상으로, 그것의 가치는 그것을 지적 &&
하고 ||
다른 우선 순위를 가지고 &
와 |
.
우선 순위 테이블 에서 추출 합니다 (가장 높은 우선 순위가 맨 위에 있음).
bitwise AND &
bitwise exclusive OR ^
bitwise inclusive OR |
logical AND &&
logical OR ||
이것이 당신에게 어떤 의미입니까?
&
and |
또는 only &&
and 중 하나만 고수하는 한 절대 아무것도 아닙니다 ||
.
그러나 ( 우선 순위가 |
낮은와 &&
달리 ||
)보다 우선 순위 가 높기 때문에 자유롭게 혼합하면 예상치 못한 동작이 발생할 수 있습니다.
그래서 a && b | c && d
과 동일 a && (b | c) && d
,
반대를 a && b || c && d
하는 것(a && b) || (c && d)
.
동일하지 않다는 것을 증명하기 위해 진리표에서 발췌 한 내용을 고려하십시오.
a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d)
F | T | T | T | T | F | T | F | T
^ ^
|- not the same -|
OR이 AND보다 우선 순위를 높이 려면 and를 함께 사용할 수 있지만 권장되지는 않습니다.|
&&
그러나 다른 기호를 사용할 때마다 우선 순위를 명확히하기 위해 괄호 안에 넣어야합니다 (a && b) || c
( 예 : 우선 순위를 명확히하는 대괄호) a && b && c
(대괄호 필요 없음).
답변
그것이 효과가 있더라도 당신은 그것을하지 말아야합니다. 언어 사양은 두 피연산자가 기본 정수 유형이거나 둘 다 부울 유형 인 경우에만 비트 연산자를 정의합니다. 다른 경우에는 결과가 정의되지 않았습니다.
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228