나의 IT일지
연산자 (논리, 비트) 본문
- 연산자 : 연산에 사용되는 표시나 기호로, 데이터를 연산하기 위해서 사용
연산자 종류 | 연산자 | 피연산자 수 | 산출값 | 기능 |
산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
부호 | +, - | 단항 | 숫자 | 음수와 양수의 부호 |
문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
대입 | =, +=, -=, *=, /=, %= | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
증감 | ++, -- | 단항 | 숫자 | 1만큼 증감 |
비교 | ==, !=, >, <, <=, >= | 단항 | 논리 | 값의 비교 |
논리 | !, &&, || | 단항 or 이항 | 논리 | 논리 부정, 논리곱, 논리합 |
비트 논리 | &, |, ^ , ! | 단항 or 이항 | 논리 | 비트 논리 부정, 비트 논리곱, 비트 논리합 |
비트 쉬프트 | <<, >> | 이항 | 숫자 | 비트 위치 이동 |
조건 | (조건)? 참:거짓 | 삼항 | 다양 | 조건식에 따라 참 또는 거짓 중 하나 선택 |
- 연산자 우선순위
- 최우선 연산자"[ ],( )"
- 단항 연산자 "!, ~, +, -, ++"
- 산술 연산자 "+, -, *, /, %"
- 쉬프트 연산자 "<<,>>"
- 관계 연산자 "<, >,==, !="
- 논리 연산자 "&&, ||"
- 삼항 연산자 "(조건)? 참 :거짓"
- 대입 연산자 "=, +=,-=
논리 연산자
논리 연산자는 여러가지 조건을 동시에 검사시 사용하는 연산자로, 항의 값이 boolean값일때 연산이 가능하다. 논리 연산자에는 1개의 피연산자를 사용하는 단항 논리 연산자(NOT연산자)와 2개의 피연산자를 사용하는 이항 논리 연산자(AND연산자, OR연산자)가 있다. 이때 단항 논리 연산자인 논리 부정 연산자의 우선순위는 논리연산자가 아닌 단항연산자로 취급힌다.
연산자 | 이름 | 예시 | 뜻 |
&& | AND | a&&b | a가 true이고 b가 true이면 결과 true |
|| | OR | a||b | a가 true이거나 b가 true이면 결과 true |
^ | XOR | a^b | a와 b의 논리가 다를 경우 결과 true |
! | NOT | !a | a가 true이면 false, a가 false이면 true |
package pack1;
public class C1 {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
System.out.println(a&&b); //true&&false = false
System.out.println(a&&c); //true&&true = true
System.out.println(b&&d); //false&&false = false
System.out.println((2<4)&&(2>1)); //true&&true = true
System.out.println(a||b); //true||false = true
System.out.println(a||c); //true||true = false
System.out.println(b||d); //false||false = false
System.out.println(!a);
System.out.println(!b);
}
}
"&&"과 "||"의 연산과정에 대해서 알아보면, "&&"의 경우, 첫번째 피연산자가 true면, 두번째 연산자를 확인하지만, 첫번쨰 피연산자가 false일 경우, 바로 false를 산출한다. 이는 "&&"가 하나만 false여도 false이기에 가능한 것이다.
"||"의 경우, 첫번째 피연산자가 false면, 두번째 연산자를 확인하지만, 첫번쨰 피연산자가 true일 경우, 바로 true를 산출한다. 이는 "||"가 하나만 true여도 true의 값을 가지기에 가능한 것이다. 이렇게 운영 함으로써, 운영의 효율이 증가하는 것이다.
비트 연산자
비트 연산자는 데이터를 비트단위로 연산하는 연산자로, 비트를 가지고 논리적으로 연산하는 비트 논리 연산자와 비트를 좌우로 움직이게 하는 비트 쉬프트 연산자로 나뉜다.
이때 비트란 무엇이냐? 데이터의 최소단위로, 이진수 0,1로 이루워진 공간이라고 생각하면 좋다. 예를들면, 8bit는 0,1이 들어갈 수 있는 공간이 8개 있다는 것이며, 이는 1byte와 같다.
비트 연산자를 사용하기 위해서는 10진수(사람이 사용하는 숫자)와 2진수를 자유롭게 변환할 줄 알아야 한다.
- 10진수를 2진수로 변환하는 방법은 다음과 같다. (예시:10을 2진수로 변환)
- 10진수를 2로 계속 나눈다.
- 몫이 0이 나오면, 몫을 기준으로 역순에 적으면 된다.
나눌 값 | 나누는 값 | 몫 | 나머지 | 10진수 : 10 2진수 : 1010(2) |
10(시작값) | 2 | 5 | 0 | |
5 | 2 | 2 | 1 | |
2 | 2 | 1 | 0 | |
1 | 2 | 0 | 1 |
- 2진수를 10진수로 변환하는 방법을 한번 보자 (예시:10의 2진수를 10진수로 변환)
- 2^0부터 시작으로 각 비트의 자릿수에 2의 지수를 적고 비트의 값과 곱한다.
- 2의 지수를 계산 후, 나온 숫자를 더한다.
2진수 자리 | 2^3의 자리 | 2^2의 자리 | 2^1의 자리 | 2^0의 자리 | 2진수 : 1010(2) 10진수 : 10 |
시작값 : 1010(2) | 1 | 0 | 1 | 0 | |
곱할 값 | 2^3 | 2^2 | 2 | 1 | |
곱한값 | 8 | 0 | 2 | 0 |
비트 논리 연산자란 비트 단위로 논리 연산을 하는 연산자로, 아래의 표는 비트 논리 연산자의 종류이다.
연산자 | 이름 | 예시 | 의미 |
& | 비트AND | a&b | 두 비트가 모두 1일때만 결과가 1 |
| | 비트OR | a|b | 두 비트중 하나라도 1이라면 결과가 1 |
^ | 비트XOR | a^b | 두 비트가 서로 다르면 1 같으면 0 |
~ | 비트NOT | ~a | 비트가 1이면 0으로 0이면 1로 전환(부호변환) |
package pack1;
public class C2 {
public static void main(String[] args) {
int a=15;
int b=5;
System.out.println(a&b);
System.out.println(a|b);
System.out.println(a^b);
System.out.println(~b);
}
}
위의 소스코드의 연산과정을 한번 확인해 보자.
연산자 | 변수 a의 2진수 | 변수 b의 2진수 | 연산결과 | 연산결과의 10진수 |
a&b (AND) | 0101 | 1111 | 0101 | 5 |
a|b (OR) | 0101 | 1111 | 1111 | 15 |
a^b (XOR) | 0101 | 1111 | 1010 | 10 |
~a(NOT) | 0101 | - | 1010 | -6 |
- AND의 경우, '0과 0은 0', '0과 1은 0', '1과 1은 1'로 출력이 되기에 0101
- OR의 경우, '0과 0은 0', '0과 1은 1', '1과 1은 1'로 출력이 되기에 1111
- XOR의 경우, '0과 0은 0', '0과 1은 1', '1과 1은 0'으로 출력되기에 1010
- NOT의 경우, '0은 1', '1은 0'으로 변환이 되기에 1010
근데, NOT연산자를 사용한 연산결과와 XOR연산자를 사용한 연산결과는 같지만 10진수로 변환했을 때 서로 다른것을 볼 수 있다.
이는 컴퓨터의 운영체제가 64bit를 지원해서 나타나는 현상인데, 하나의 데이터를 표현할 때, 64bit로 표현한다. 그래서 "5"를 2진수로 변환하면, "0 000 0000 0000.... 0101(2)"가 되며, NOT연산자를 사용하면 "1 111 1111 1111....1010(2)"가 되는 것이다.
그렇다면 "1 111 1111 1111....1010(2)"가 왜 "-6" 일까? 해당 2진수와 AND연산을 해서 결과 값이 0이 되는 값을 확인해 보자.
AND연산 할 2진수 | 0의 2진수 | AND연산해서 0이 되는 값 | 0이 되는 값의 10진법 |
1 111 1111 1111....1010(2) | 0 000 0000 0000 .... 0000(2) | 0 000 0000 0000 .... 0110(2) | 6 |
즉 "0 000 0000 0000 .... 0110(2)"인 "6"이 0이 될려면 "-6"을 더하면 되며, 이를 2진수로 표현하면 "1 111 1111 1111....1010(2)" 가 되는 것이다.
비트 쉬프트 연산자란 비트를 이동시키는 연산자로, 아래의 표는 비트 쉬프트 연산자의 종류이다.
연산자 | 이름 | 예시 | 내용 |
<< | 왼쪽 쉬프트 | a<<4 | a의 내용을 왼쪽으로 4bit이동 |
>> | 오른쪽 쉬프트 | a>>4 | a의 내용을 오른쪽으로 4bit이동 |
package pack1;
public class C2 {
public static void main(String[] args) {
System.out.println(15>>2);
System.out.println(5<<4);
}
}
위 소스코드의 연산과정을 한번 확인해 보자.
연산자 사용 예시 | 연산자 사용 전 데이터 값 2진수 | 연산결과 | 연산결과의 10진수 |
15>>2 | 0000 1111(2) | 0000 0011(2) | 3 |
5<<4 | 0000 0101 | 0101 0000(2) | 80 |
- 5<<4의 경우, 2진수의 비트 값을 왼쪽으로 4칸씩 옮김
- 15>>2의 경우, 2진수 값을 오른쪽으로 2칸씩 옮김
정리하자면, 왼쪽 쉬프트는 비트값이 왼쪽으로 옮겨지며, 빈자리는 0으로 채워지고, 밀려난 값은 삭제가 되며, 오른쪽 쉬프트는 비트값이 오른쪽으로 옮겨지며, 빈자리는 0으로 채워지고, 밀려난 값은 삭제가 된다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
조건문(if문) (0) | 2023.03.21 |
---|---|
연산자(삼항, 대입) (1) | 2023.03.18 |
연산자(산술, 단항, 비교) (0) | 2023.03.16 |
변수와 상수 (0) | 2023.03.15 |
Java 프로그래밍의 이해 (0) | 2023.03.14 |