4. 연산자

Isaiah IM·2023년 1월 13일
0

java basic

목록 보기
5/38
post-thumbnail

1. 연산자란?

연산자(Operators)란 연산을 목적으로 정의된 기호를 의미한다. 즉, 연산자란 사칙연산, 비트연산 등 "계산"을 하기 위한 기호이다.


2. 연산자의 우선순위

java에는 각종 계산을 위한 연산자가 존재하며, 이 연산자에는 우선순위가 있다.
이때, 연산자의 우선순위란 하나의 식에 둘 이상의 연산자가 있을 경우, 연산을 먼저 하는 순서이다.

연산자의 우선순위를 표로 나타내면 다음과 같다.

예를 들어 c=3+2-1*5 라는 식이 있을때, c의 값을 계산하기 위해서는 연산자의 우선순위를 알아야 한다.
위 식의 경우, 곱셈의 우선순위가 덧셈과 뺄셈보다 높기 때문에 다음과 같이 1x5를 먼저 곱해 연산을 진행한다.
c=3+2-5

그 다음으로, 나머지 덧셈과 뺄셈은 우선순위가 같으므로, 결합방향대로 왼쪽에서부터 오른쪽으로 연산을 진행해 3+2를 연산한다
c=5-5

마지막으로, 결합방향대로 연산을 진행해 5-5를 연산한다.
c=0

java 내부에서는 수식이 주어질 때 이러한 과정을 통해 연산을 진행한다.


3. 연산자의 종류

연산자는 증감 연산자, 산술 연산자, 복합 대입 연산자, 관계 연산자, 논리 연산자, 비트 연산자, 비트 쉬프트 연산자로 구성되 있다.

3.1 증감 연산자

증감 연산자란 변수의 값을 1증가/감소시키는 연산자로 ++기호의 경우 값을 1 증가, --기호의 경우 값을 1 감소시키는 기호로 사용한다.

이러한 증감 연산자는 prefix 방식과 postfix 방식으로 나뉜다.

  • prefix

prefix방식은 ++value;와 같이 변수 앞에 ++ 혹은 --기호를 사용해 값을 증감시키는 방식이다.

이를 코드로 확인하면 다음과 같다.

public class Prefix {
	public static void main(String[] args) {
		int num=10;
		
		System.out.println("before prefix increase: "+ num);
		System.out.println("after prefix increase: "+ ++num);
		
		System.out.println("before prefix decrease: "+ num);
		System.out.println("after prefix decrease: "+ --num);
		
	}

}

output:

before prefix increase: 10
after prefix increase: 11
before prefix decrease: 11
after prefix decrease: 10
  • postfix

postfix방식은 value++;과 같이 변수 뒤에 ++ 혹은 --기호를 사용해 값을 증감시키는 방식이다.

이를 코드로 확인하면 다음과 같다.

public class Postfix {
	public static void main(String[] args) {
		int num=10;
		
		System.out.println("before postfix increase: "+ num);
		System.out.println("after postfix increase: "+ num++);
		
		System.out.println("before postfix decrease: "+ num);
		System.out.println("after postfix decrease: "+ num--);
		
	}

}

output:

before postfix increase: 10
after postfix increase: 10
before postfix decrease: 11
after postfix decrease: 11
  • prefix와 postfix의 차이점

같은 연산을 prefixpostfix 방식으로 했을 때, 결과값이 다름을 알 수 있다. 이는 prefixpostfix의 내부 동작 순서에 차이가 있기 때문이다.
prefix 방식은 "먼저" 값을 증감한 다음 변수에 증가된 값을 바로 대입하는 방식이다.
반면에 postfix방식은 값을 먼저 사용한 후, "다음줄에서" 값을 증감하는 방식이다.

즉, prefix방식은 증가되는 값이 즉각 적용되지만, postfix의 경우, 다음줄에서 증감된 값이 적용된다.

즉, 아래와 같은 코드에서의 value의 값은 10이 된다.

public class Postfix {
	public static void main(String[] args) {
		int num=10;
		int value;
		
		value=num++;
		
		System.out.println(value);
	}

}

output

10

위의 코드에서는 num이 1 증가한 11이 되는 시점은 value에 값이 들어간 이후, 즉, value=num++; 다음줄에서 진행이 된다.

반면에 아래와 같은 코드에서는 num에 1을 증가하는 연산이 즉각 적용되 value의 값이 11이 된다.

public class Prefix {
	public static void main(String[] args) {
		int num=10;
		int value;
		
		value=++num;
		
		System.out.println(value);
	}

}

output

11

3.2 산술 연산자

산술연산자란 사칙연산 및 나머지를 구하기 위한 연산자로, 다음과 같은 표로 구성되 있다.

이때, 곱셈, 나눗셈, 나머지 연산이 덧셈 및 뺄셈연산보다 우선순위가 높다.

산술연산자를 계산하는 코드는 다음과 같다.

public class ArithOp {
	public static void main(String[] args) {
		int a=10;
		int b=3;
		
		System.out.println("a+b is "+ (a+b) );
		System.out.println("a-b is "+ (a-b) );
		System.out.println("a*b is "+ (a*b) );
		System.out.println("a/b is "+ (a/b) );
		System.out.println("a%b is "+ (a%b) );
	}

}

output

a+b is 13
a-b is 7
a*b is 30
a/b is 3
a%b is 1

이때, 나눗셈 연산을 했을때, 3.333...이 아닌 3이 되는 이유는 두 피연산자 모두 정수 형태이므로, 정수로 나눗셈이 진행이 됬기 때문에 3.333..에서 소숫점이 손실이 됬기 때문이다.

3.3 복합 대입 연산자

복합 대입 연산자는 num+=1;과 같이 다른 연산자가 대입 연산자 앞에 결합한 경우를 의미한다.

복합 대입연산자는 산술 연산자와 비트 연산자가 결합할 수 있으며, 산술 연산자와 결합한 경우는 다음과 같다.

  • 산술 연산자와 결합한 경우
복합 대입 연산자원래 연산 형태연산 의미
a+=ba = a + ba와 b를 더한 값을 a에 대입
a-=ba = a - ba에서 b를 뺀 값을 a에 대입
a*=ba = a * ba와 b를 곱한 값을 a에 대입
a/=ba = a / ba를 b로 나눈 값을 a에 대입
a%=ba = a % ba를 b로 나눴을 때의 나머지 값을 a에 대입
  • 비트 연산자와 결합한 경우
복합 대입 연산자원래 연산 형태연산 의미
a&=ba = a & ba와 b를 bitwise AND 한 값을 a에 대입
a|= ba = a | ba와 b를 bitwise OR 한 값을 a에 대입
a^=ba = a ^ ba와 b를 bitwise XOR 한 값을 a에 대입
a<<=ba = a << ba를 b bit 만큼 bitwise right shift 한 값을 a에 대입
a>>=ba = a >> ba를 b bit 만큼 bitwise left shift 한 값을 a에 대입(음수의 경우 비어있는 비트만큼 1을 채움)
a>>>=ba = a >>> ba를 b bit 만큼 bitwise left shift 한 값을 a에 대입(음수의 경우 비어있는 비트만큼 0을 채움)

비트 연산자의 경우 잠시후 다룰 예정이니, "비트연산도 결합할 수 있다." 라고만 알아둬도 무방하다.

복합 대입 연산자를 코드로 작성하면 다음과 같다.

public class CompoundOp {
	public static void main(String[] args) {
		int a=10;
		int b=3;
		
		
		/*operate*/
		a+=b;
		System.out.println("a+=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a-=b;
		System.out.println("a-=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a*=b;
		System.out.println("a*=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a/=b;
		System.out.println("a/=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a%=b;
		System.out.println("a%=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a&=b;
		System.out.println("a&=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a|=b;
		System.out.println("a|=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a^=b;
		System.out.println("a^=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a<<=b;
		System.out.println("a<<=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a>>=b;
		System.out.println("a>=b is "+ a);
		
		/*variable initialize*/
		a=10;
		b=3;
		
		
		/*operate*/
		a>>>=b;
		System.out.println("a>>>=b is "+ a);
		
	}

}

output

a+=b is 13
a-=b is 7
a*=b is 30
a/=b is 3
a%=b is 1
a&=b is 2
a|=b is 11
a^=b is 9
a<<=b is 80
a>=b is 1
a>>>=b is 1

3.4 관계 연산자

관계 연산자란 두 피연산자(변수, 상수등..)의 크기 및 동등한 관계인지를 확인하는 연산자이다.

관계 연산자는 아래 표와 같이 크기를 비교하는 역할을 하며, 크기를 비교하는 역할을 하기에 비교 연산자 라고도 부른다.

관계 연산자연산자의 기능(의미)
a>ba가 b보다 큰가?
a>=ba 가 b보다 크거나 같은가?
a<bb가 a보다 큰가?
a<=bb가 a보다 크거나 같은가?
a==ba 와 b가 같은가?
a!=ba 와 b가 같지 않은가?

관계연산자의 연산의 결과가 참일 경우 true를 반환하며, 연산의 결과가 거짓일 경우에는 false를 반환한다.

이때, 연산 결과는 boolean 자료형의 변수에 저장할 수 있다.

관계 연산자를 코드로 작성하면 다음과 같다.

public class RelateOp {
	public static void main(String[] args) {
		int a=10;
		int b=3;
		boolean state;
		
		
		state=a>b;
		System.out.println("a is grather than b?:  "+ state);
		
		state=a>=b;
		System.out.println("a is more than b?: "+ state);
		
		state=a<b;
		System.out.println("a is less than b?: "+ state);
		
		state=a<=b;
		System.out.println("a is not more than b?: "+ state);
		
		state=a==b;
		System.out.println("a and b is equal?: "+ state);
		
		state=a!=b;
		System.out.println("a and b is not equal? : "+ state);
	}

}

output

a is grather than b?:  true
a is more than b?: true
a is less than b?: false
a is not more than b?: false
a and b is equal?: false
a and b is not equal? : true

3.5 논리 연산자

논리 연산자란 두 논리를 비교해 true 혹은 false를 반환하는 연산자이다.

논리 연산자는 truefalse로 이루어진 두 논리 상태를 비교해 상태를 true혹은 false로 반환하는 연산자이며, 다음과 같은 종류가 있다.

논리 연산자연산자의 기능(의미)
a&&ba와 b가 모두 true인가?
a||ba 와 b 둘중에 하나 이상이 true인가?
!aa의 논리를 반전(a=true일때 false 반환, a=false일때 true 반환)

논리 연산자를 코드로 작성하면 다음과 같다.

public class LogicOp {
	public static void main(String[] args) {
		int a=10;
		int b=3;
		boolean state;
		
		
		state=(a>0) && (b<10);
		System.out.println("a is grather than 0 AND b is lenn than 10?:  "+ state);
		
		state=(a>10) || (b<0);
		System.out.println("a is greater than 10 OR b is under than 0?: "+ state);
		
		state=!(a>b);
		System.out.println("a is NOT greater than b?: "+ state);
	}

}

output

a is grather than 0 AND b is lenn than 10?:  true
a is greater than 10 OR b is under than 0?: false
a is NOT greater than b?: false

3.5.1 논리 연산시 주의할점: Short Circuit Evaluation(SCE)

java에서는 논리 연산시 첫번째 조건에 따라서 연산이 필요 없는 경우에는 생략하는 Short Circuit Evaluation(SCE) 라는 것을 지원한다.

예를 들어보자.
a&&b라는 논리 연산에서 만약 조건 a가 false일 경우에는 두 조건 모두가 true가 아닌 이상 결과값이 무조건 false이기에 조건 b를 확인할 필요가 없으므로 조건 b를 실행하지 않는다.
또한, 만악 a||b라는 논리 연산에서 조건 a가 true일 경우에도 b의 조건과 상관 없이 결과가 true이므로 조건 b를 실행하지 않는다.
논리 연산자를 설계할 경우 이러한 SCE를 고려해 설계를 해야 한다.

예를 들어보자.
첫번째 변수에 5를, 두번째 변수에 3을 더한 후, 논리 연산을 수행한다고 가정한다고 할때, SCE를 고려하지 않고 설계하면 다음과 같다.

public class SCE {
	public static void main(String[] args) {
		int num1=0;
		int num2=0;
		boolean result;
		
		result= ((num1+=5)<0) && ((num2+=3)>0);
		System.out.println("num1: "+ num1);
		System.out.println("num2: "+ num2);
		System.out.println("logic result: "+ result);
		
		System.out.println("");// next line
		
		result= ((num1+=5)>0) || ((num2+=3)<0);
		System.out.println("num1: "+ num1);
		System.out.println("num2: "+ num2);
		System.out.println("logic result: "+ result);
	}

}

output

num1: 5
num2: 0
logic result: false

num1: 10
num2: 0
logic result: true

SCE를고려하지 않았을 경우, 첫번째 첫번째 조건에서 true혹은 false조건을 만족하기 때문에 SCE에 의해 두번째 조건이 실행되지 않아 두번째 변수에 3이 더해지지 않는 예상치 못한 오류가 발생하였다.
실제로 개발하면서 이러한 오류는 자주 발생할 수 있으므로, 이에 유의해서 설계를 해야한다.

위의 코드를 SCE를 고려해 다시 설계하면 다음과 같다.

public class SCE {
	public static void main(String[] args) {
		int num1=0;
		int num2=0;
		boolean result;
		
		/*SCE*/
		num1+=5;
		num2+=3;
		result= ((num1)<0) && ((num2)>0);
		System.out.println("num1: "+ num1);
		System.out.println("num2: "+ num2);
		System.out.println("logic result: "+ result);
		
		System.out.println("");// next line
		
		/*SCE*/
		num1+=5;
		num2+=3;
		result= ((num1)>0) || ((num2)<0);
		System.out.println("num1: "+ num1);
		System.out.println("num2: "+ num2);
		System.out.println("logic result: "+ result);
	}

}

output

num1: 5
num2: 3
logic result: false

num1: 10
num2: 6
logic result: true

SCE를 고려해 설계하는 방법은 생각보다 간단하다.
논리 연산시 가급적이면 값이 변하는 대입 및 증감연산은 하지 않는 것이다.
또한, 가독성을 고려해서라도 SCE가 적용되지 않는 상황이라 하더라도 논리연산시 값이 변할 수 있는 대입 및 증감연산은 되도록 같이 하지 않는 것이 유용하다.

3.6 비트 연산자

비트 연산자는 비트 단위로 연산을 하는 연산자이며, 이 비트는 변수값의 이진수 값을 의미한다.

비트 연산자는 변수값의 2진수 단위로 and, or, xor등의 연산을 하는 연산자이다.

비트 연산자의 종류는 다음과 같다.

비트 연산자연산자의 기능(의미)
a&b2진수 단위로 and연산
a|b2진수 단위로 or연산
a^b2진수 단위로 xor연산
~a2진수 단위로 not연산

3.6.1 비트 연산

예를 들어 x=10, y=20이라고 가정하자.
이를 2진수로 변환하면 다음과 같다.
x=0b01010
y=0b10100
이때, 비트연산이란, 다음 그림과 같이 x와 y의 각 자릿수 별로 연산을 하는 것이다.

3.6.2 비트 AND 연산(bitwise AND)

비트 AND 연산은 각 비트에 대해 다음과 같이 연산을 진행한다.

ABA&B
000
010
100
111

위 표와 같이 bitwise AND 연산은 두 비트가 모두 1인 경우에만 1이 되는 연산이다.

3.6.3 비트 OR 연산(bitwise OR)

비트 OR 연산은 각 비트에 대해 다음과 같이 연산을 진행한다.

ABA|B
000
011
101
111

위 표와 같이 bitwise OR 연산은 두 비트중 하나 이상이 1인 경우에 1이 되는 연산이다.

3.6.4 비트 XOR 연산(bitwise XOR)

비트 XOR 연산은 각 비트에 대해 다음과 같이 연산을 진행한다.

ABA^B
000
011
101
110

위 표와 같이 bitwise XOR 연산은 두 비트가 서로 다른 경우에 1이 되는 연산이다.

3.6.5 비트 NOT 연산(bitwise NOT)

비트 NOT 연산은 각 비트에 대해 다음과 같이 연산을 진행한다.

A~A
01
10

위 표와 같이 bitwise NOT 각 비트를 반전해 0을 1로, 1을 0으로 바꾸는 연산이다.

비트 연산자를 코드로 작성하면 다음과 같다.

public class BitwiseOp {
	public static void main(String[] args) {
		byte data1=0b00110011;
		byte data2=0b01001111;
		byte result;
		
		result= (byte)(data1&data2);
		System.out.println("data1&data2: "+ Integer.toBinaryString(result));
		
		result= (byte)(data1|data2);
		System.out.println("data1|data2: "+ Integer.toBinaryString(result));
		
		result= (byte)(data1^data2);
		System.out.println("data1^data2: "+ Integer.toBinaryString(result));
		
		result= (byte)(~data1);
		System.out.println("~data1: "+ Integer.toBinaryString(result));
	}

}

output

data1&data2: 11
data1|data2: 1111111
data1^data2: 1111100
~data1: 11111111111111111111111111001100

3.7 비트 쉬프트 연산자

비트 쉬프트 연산이란 아래 그림과 같이 비트단위로 왼쪽 혹은 오른쪽으로 이동시키는 것을 의미한다.

또한 비트 쉬프트 연산을 하기 위해서는 쉬프트 하는 숫자가 반드시 정수여야만 한다.

비트 쉬프트 연산 역시 앞에서 기술한 바와 같이 복합 대입 연산자를 지원한다.

3.7.1 bitwise left shift operator

bitwise left shift operator이란 아래 그림과 같이 비트를 왼쪽으로 이동시키는 연산자를 의미한다.

bitwise left shift operator를 통해 이동 후 비어있는 비트에 대해서는 0으로 초기화를 진행한다.
즉, 0b00111001을 1비트를 bitwise left shift하면 0b01110010이 된다.

이때, 변수 A를 n비트 bitwise left shift 하는 것을 코드로는 A<<n이라 표기한다.
즉, 위의 예를 코드로 나타내면 0b00111001<<1;이 된다.

bitwise left shift operator를 코드로 작성하면 다음과 같다.

public class BitwiseShift {
	public static void main(String[] args) {
		int data1=0b00110011;
		int result;
		
		result= data1<<5;
		System.out.println("data1<<5: "+ Integer.toBinaryString(result));
		
		result= data1<<10;
		System.out.println("data1<<10: "+ Integer.toBinaryString(result));
	}

}

output

data1<<5: 11001100000
data1<<10: 1100110000000000

3.7.2 bitwise right shift operator

bitwise right shift operator이란 아래 그림과 같이 비트를 왼쪽으로 이동시키는 연산자를 의미한다.

bitwise right shift operator를 통해 이동 후 비어있는 비트에 대해서는 양수의 경우 0으로 음수의 경우에는 1로 초기화를 진행한다.
즉, 0b00111001을 1비트를 bitwise right shift하면 0b00011100이 된다. 그러나, 값이 음수의 경우인 0b10011101의 경우 1비트를 bitwise right shift하면 0b11001110이 된다.

이때, 변수 A를 n비트 bitwise right shift 하는 것을 코드로는 A>>n이라 표기한다.
즉, 위의 첫번째 예를 코드로 나타내면 0b00111001>>1;이 된다.

bitwise right shift operator를 코드로 작성하면 다음과 같다.

public class BitwiseShift {
	public static void main(String[] args) {
		int data1=0b00110011;
		int data2=-1000;
		int result;
		
		result= data1>>5;
		System.out.println("data1>>5 decimal: "+ result);
		System.out.println("data1>>5 binary: "+ Integer.toBinaryString(result));
		
		result= data2>>5;
		System.out.println("data2>>5 decimal: "+ result);
		System.out.println("data2>>5 binary: "+ Integer.toBinaryString(result));
	}

output

data1>>5 decimal: 1
data1>>5 binary: 1
data2>>5 decimal: -32
data2>>5 binary: 11111111111111111111111111100000

3.7.3 bitwise unsigend right shift operator

bitwise unsigend right shift operator는 bitwise right shift operator와 동일하게 오른쪽으로 비트를 이동시킨다는 점에서는 동일하나, 음수의 경우에도 비어있는 비트를 양수와 동일하게 0으로 초기화 시킨다.
즉, 0b00111001을 1비트를 bitwise unsigend right shift하면 bitwise right shift를 한 경우와 동일하게 0b00011100이 된다. 그러나, 값이 음수의 경우에는 0b10011101의 경우 1비트를 bitwise unsigned right shift하면 0b01001110이 된다.

이때, 변수 A를 n비트 bitwise unsigned right shift 하는 것을 코드로는 A>>>n이라 표기한다.
즉, 위의 첫번째 예를 코드로 나타내면 0b00111001>>>1;이 된다.

bitwise right shift operator를 코드로 작성하면 다음과 같다.

public class BitwiseShift {
	public static void main(String[] args) {
		int data1=0b00110011;
		int data2=-1000;
		int result;
		
		result= data1>>>5;
		System.out.println("data1>>>5 decimal: "+ result);
		System.out.println("data1>>>5 binary: "+ Integer.toBinaryString(result));
		
		result= data2>>>5;
		System.out.println("data2>>>5 decimal: "+ result);
		System.out.println("data2>>>5 binary: "+ Integer.toBinaryString(result));
	}


}

output

data1>>>5 decimal: 1
data1>>>5 binary: 1
data2>>>5 decimal: 134217696
data2>>>5 binary: 111111111111111111111100000

4. 실습

  • Q1

다음 코드에서 a의 값은 무엇이며 왜 그 값이 나오는가?

int a=10;
int b=20;
int c=50;
int d=125;

a=b=c=d;
  • Q2

아래 조건에서 n1>n2>n3일 경우 true를, 아닐 경우에는 false를 출력하는 코드를 작성하시오(if문 사용 금지).

n1= {(25+5) + (36*2)-30} * (10/3)
n2= {(25*3) + (36/3)-20} / 5
n3= 25/4

  • Q3

int 형 정수 12345의 오른쪽 끝의 3번째와 6번째 비트를 구해 출력하는 코드를 작성하시오.


  • A1

code:

public class Q1 {
	public static void main(String[] args) {
		int a=10;
		int b=20;
		int c=50;
		int d=125;
		
		a=b=c=d;
		
		System.out.println("a is "+ a);

	}
}

output:

a is 125

a가 125인 이유:
대입 연산자의 경우는 우선순위가 오른쪽에서 부터 왼쪽으로 이동하기 때문에 가장 오른쪽에 있는 d의 값인 125가 c에 대입되고, 그 다음에 c에 대입되었던 125가 b에 대입된다.
마지막으로 b에 대입되었던 125가 a에 대입되면서 a=125가 되는 것이다.

  • A2

code:

public class Q2 {
	public static void main(String[] args) {
		double n1, n2, n3;
		boolean result;
		
		n1=( (25+5) + (36*2)-30 )*(10.0/3.0);
		n2=( (25*3) + (36.0/3.0)-20)/5.0;
		n3=25.0/4.0;
		
		result= (n1>n2) && (n2>n3);
		System.out.println(result);
	}
}

output:

true

먼저 n1이 n2보다 크면서(n1>n2) 동시에 n2가 n3보다 큰 경우(n2>n3)에는 n1>n2>n3가 되므로, 굳이 if조건문을 사용하지 않아도 구할 수 있다.

  • A3

code:

public class Q3 {
	public static void main(String[] args) {
		int num=12345;
		int bit_3;
		int bit_6;
		
        /*3th bit masking*/
		bit_3=num&0b100;
		bit_3>>=2;
		
        /*6th bit masking*/
		bit_6=num&0b100000;
		bit_6>>=5;
		
		System.out.println("third bit: "+ bit_3);
		System.out.println("sixth bit: "+ bit_6);
		
	}
}

output:

third bit: 0
sixth bit: 1

특정한 변수에서 특정한 비트의 값을 얻고 싶은 경우 특정한 얻고 싶은 비트에 1을 bitwise AND연산을 하면 특정 비트를 얻을 수 있다. 이를 masknig이라 한다.
위 예제에서는 세번째와 여섯번째 비트를 얻고 싶으므로, 세번째 비트를 얻기 위해서는 0b100을 bitwise and 연산을 하면 세번째 비트의 상태를, 여섯번째 비트를 얻기 위해서는 0b100000을 bitwise and 연산을 하면서 어섯번째 비트의 상태를 얻었다.
또한, 비트의 상태는 1과 0 만으로 나타내기 위해서 자릿수를 첫번째 자리로 옮기기 위해서 bitwise right shift연산을 사용했다.

위 주소에서 code를 다운로드 받아 eclipse로 직접 정답 확인이 가능하다.
https://github.com/isaiahIM/java_basic/tree/main/operators

profile
나는 생각한다. 고로 나는 코딩한다.

0개의 댓글