비트단위로 연산하는 연산자
\
: 'OR' 연산자
&
: 'AND' 연산자
^
: 'XOR' 연산자 (두 연산자의 비트가 다를때만 1이 된다.)
public class ch3_OperatorEx28 {
public static void main(String[] args) {
int x = 0xAB, y = 0xF;
System.out.printf("x = %#X \t\t%s%n", x, toBinaryString(x)); // %X : 16진수, %#X : 접두사가 붙은 16진수
System.out.printf("y = %#X \t\t%s%n", y, toBinaryString(y));
// '|' : 'OR' 연산자
System.out.printf("%#X | %#X = %#X \t%s%n", x, y, x | y, toBinaryString(x|y));
// '&' : 'AND' 연산자
System.out.printf("%#X & %#X = %#X \t%s%n", x, y, x & y, toBinaryString(x&y));
// '^' : 'XOR' 연산자 (두 연산자의 비트가 다를때만 1이 된다.)
System.out.printf("%#X ^ %#X = %#X \t%s%n", x, y, x^y, toBinaryString(x^y));
// 다시 연산하면 원래의 값으로 돌아오는 특징이 있다.
System.out.printf("%#X ^ %#X ^ %#X = %#X %s%n", x, y, y, x^y^y, toBinaryString(x^y^y)); // x
System.out.printf("%#X ^ %#X ^ %#X = %#X %s%n", x, y, x, x^y^x, toBinaryString(x^y^x)); // y
}
// 아래 매서드는 추후에 이해하기로 한다
// 10진 정수를 2진수로 변환하는 메서드
static String toBinaryString(int x) {
String zero = "00000000000000000000000000000000";
String tmp = zero + Integer.toBinaryString(x);
return tmp.substring(tmp.length()-32);
}
결과값
x = 0XAB 00000000000000000000000010101011
y = 0XF 00000000000000000000000000001111
0XAB | 0XF = 0XAF 00000000000000000000000010101111
0XAB & 0XF = 0XB 00000000000000000000000000001011
0XAB ^ 0XF = 0XA4 00000000000000000000000010100100
0XAB ^ 0XF ^ 0XF = 0XAB 00000000000000000000000010101011
0XAB ^ 0XF ^ 0XAB = 0XF 00000000000000000000000000001111
~
: 0은 1로, 1은 0으로 바꾼다.
public static void main(String[] args) {
byte p = 10;
byte n = -10;
System.out.printf(" p =%d \t%s%n", p, toBinaryString(p));
// 1의 보수 관계
System.out.printf("~p =%d \t%s%n", ~p, toBinaryString(~p));
// 양의정수를 음의 정수로 바꾸고 싶을때
System.out.printf("~p+1=%d \t%s%n", ~p+1, toBinaryString(~p+1));
System.out.printf("~~p =%d \t%s%n", ~~p, toBinaryString(~~p));
System.out.println();
// 음의정수를 양의정수로 바꾸고 싶을때
System.out.printf(" n =%d%n", n);
System.out.printf("~(n-1)=%d%n", ~(n-1));
}
// 10진 정수를 2진수로 변환하는 메서드
static String toBinaryString(int x) {
String zero = "00000000000000000000000000000000";
String tmp = zero + Integer.toBinaryString(x);
return tmp.substring(tmp.length()-32);
}
결과값
p =10 00000000000000000000000000001010
~p =-11 11111111111111111111111111110101
~p+1=-10 11111111111111111111111111110110
~~p =10 00000000000000000000000000001010
n =-10
~(n-1)=10
어떤 방식으로 연산이 이루어지는지는 이해했지만 아직까지 이 연산을 어디다가 써먹어야하는지는 감이 오지를 않는다.