비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이빈수로 표현했을 때의 각 자리를 아래의 규칙에 따라 수행 하면 피연산자 실수는 허용하지 않는다. 정수(문자포함)만 허용
| (OR연산자) : 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다, 그 외에는 0을 얻는다.
& (AND연산자) : 피연산자 양쪽이 모두 1 이어야만 1을 결과로 얻는다. 그외에는 0을 얻는다.
^ (XOR연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다. ( 1 ^ 1 = 0)
|(OR연산자)는 주로 특정 비트의 값을 변경할 때 사용한다. (0xAB | 0xF = 0xAF)
&(AND연산자)는 주로 특정 비트의 값을 뽑아 낼 때 사용한다.(0xAB & 0xF = 0xB)
^(XOR연산자)는 두 피연산자의 비트가 다를 때만 1이 된다. 그리고 같은 값으로 두고 XOR연산을 수행하면 원래의 값으로 돌아오는 특징이 있어서 간단한 암호화에 사용된다.
논리 연산자랑 다름
||(OR결합) : 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
&&(AND결합) : 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
조건 연산자 ? :
조건 연산자는 조건식? 식1 : 식2
true면 식1, false면 식2가 된다.
조건연산자 쓰는 이유 if문보다 간략하다 조건 연산자를 중첩해서 사용하면 셋 이상 중의 하나를 결과로 얻을 수 있다.
조건연산자를 여러 번 중첩하면 코드가 간략해지긴 하지만, 가독성이 떨어지므로 꼭 필요한 경우에 한 번 정도만 중첩하는 것이 좋다.
타입이 다른 경우 연산자처럼 산술 변환이 발생한다. double타입으로 통일
x = x + (mod <0.5? 0.0 : 0.5) 0이 0.0으로 변환되었다.
public class OperatorEx32 {
public static void main(String[] args) {
int x,y,z;
int absX,absY,absZ;
char signX, signY, signZ;
x=10;
y=-5;
z=0;
absX = x >= 0 ? x : -x; //x의 값이 음수이면, 양수로 만든다.
absY = y >= 0 ? y : -y;
absZ = z >= 0 ? z : -z;
signX = x > 0 ? '+' : (x==0 ? ' ' : '-');
signY = y > 0 ? '+' : (y==0 ? ' ' : '-');
signZ = z > 0 ? '+' : (z==0 ? ' ' : '-');
System.out.printf("x=%c%d%n", signX , absX);
System.out.printf("y=%c%d%n", signY , absY);
System.out.printf("z=%c%d%n", signZ , absZ);
}
x=+10
y=-5
z= 0
public class OperatorEx28 {
public static void main(String[] args) {
int x = 0xAB, y = 0xF;
System.out.printf("x = %#X \t\t%s%n", x, toBinaryString(x));
System.out.printf("y = %#X \t\t%s%n", y, toBinaryString(y));
System.out.printf("%#X ^ %#X = %#X %s%n", x, y, x ^ y, toBinaryString(x ^ y));
}
static String toBinaryString(int x) { //10진수 정수를 2진수로 변환하는 메서드
String zero = "0000000000000000000000000000";
String tmp = zero + Integer.toBinaryString(x);
return tmp.substring(tmp.length() - 32);
}
}
x = 0XAB 00000000000000000000000010101011
y = 0XF 00000000000000000000000000001111
0XAB ^ 0XF = 0XA4 00000000000000000000000010100100