논리연산자
AND 연산자
- & : and연산자, 두가지모두만족
- && : and연산자, 두가지모두만족
❓&& 와 &의 차이
➡️결과값은 같지만 JVM에서는 다르게 동작
&&연산자 : 앞의 식이 거짓이면, 뒤에 있는 식은 실행하지 않음. 한쪽만 거짓이어도 실행할 필요가 없기때문이다.
&연산자 : 앞의 식이 거짓이라도 뒤의 식이 실행
OR 연산자
- | : or연산자, 둘 중 한가지만 만족
- || : or연산자, 둘 중 한가지만 만족
❓|| 와 | 의 차이
➡️결과값은 같지만 JVM에서는 다르게 동작
|| 연산자 : 앞의 식이 참일경우 뒤의 식은 실행되지 않는다. (어느한쪽이라도 참이 있으면 참이기때문)
| 연산자 : 앞의 식이 참일경우에도 뒤의 식이 실행
XOR 연산자
- ^ : Exclusive OR 라고 부름
- 배타적 논리합 연산자
- 둘의 결과 값이 서로 반대일때만 (참)
- ex. a > 10 ^ a < 20
➡️좌측(a>10), 우측(a<20)의 값이 서로 반대이면 true
➡️만약 a=31이면 true XOR false가 되니 true를 가짐.
부정연산자
- ! 연산자를 의미하며, 결과값을 반대로 바꿈 (true 는 false, false는 true)
산술 연산자
- + : 덧셈 연산자
- - : 뺼셈 연산자
- / : 나눗셈 연산자
- % : 나머지 연산자 (=모듈러 연산자)
비트 연산자
- 논리 연산자와 비슷하지만 bit단위로 논리연산을 할때 사용하는 연산자
- bit(비트)는 "컴퓨터가 다루는 정보의 최소단위"
- byte(바이트)는 이러한 bit 8개가 모여서 "정보를 처리할 수 있는 최소 단위"
- 따라서 1bit만 메모리에 저장하지 못하고 최소 1byte가 필요
➡️1byte에 1bit만큼을 담아서 저장 - 따라서 1byte는 00000000 ~ 11111111 까지 값을 표현 가능
- 이를 정수로 표현하면 0부터 254까지 표현 가능 (부호비트가 없다고 가정)
➡️ex. 4비트는 0부터 15까지 표현 가능 : 0000 ~ 1111 (0에서 2^3 + 2^2 + 2^1 + 2^0까지) - 16진수로 표현하면 00부터 FF까지 표현가능
비트 연산자 종류
- & (and) : 비트가 모두 1로 같으면 1 나머진 0
- | (or) : 비트 중 하나라도 1이면 1, 나머진 0
- ^ (xor) (윗꺾쇠) : 비트가 서로 다르면 1, 같으면 0
- ~ (not) : 비트를 반전시킴 1이면 0, 0이면 1, 논리연산자에서는 ! 가 부정연산자
- << : 좌측시프트 (shift) (좌측 꺾쇠 2개) : 명시된 수만큼 비트들을 전부 왼쪽으로 이동
- >> : 우측시프트 (shift) (우측 꺾쇠 2개) : “부호를 유지하면서” 지정한 수만큼 비트들을 전부 오른쪽으로 이동
- >>> : 우측 양수화 시프트 (shift) (우측 꺾쇠 3개) : 결과가 무조건 양수
💡&, |는 논리연산자로도 사용
❓& 11111111의 결과
➡️비트가 둘다 1일때만 1이므로 결과는 00000000
❓좌측시프트, 우측시프트 연산
➡️정수 4를 1byte로 표현 (0000 0100)
좌측시프트 결과 : 0000 1000
우측시프트 결과 : 0000 0010
➡️숫자 4의 전체적인 구조는 (00000000 00000000 00000000 00000100)이지만
연산을 간단히 보기 위해 뒤의 2바이트만 확인
💡우측시프트 후 가장 좌측의 비트가 비워지게 되어도 0으로 채워짐
💡좌측시프트 후 가장 우측의 비트가 비워지게 되어도 0으로 채워짐
ex. int a = 4 가 있을때 (int b에 a를 시프트한 결과 할당)
➡️int b = a >> 1 (정수 4를 1칸 우측시프트) 💡시프트 전 : 0000 0100 (2^2 = 4), 시프트 후 : 0000 0010 (2^1 = 2)
➡️int b = a >> 2 (정수 4를 2칸 우측시프트) 💡시프트 전 : 0000 0100 (2^2 = 4), 시프트 후 : 0000 0001 (2^0 = 1)
규칙 찾기
➡️우측 1 시프트 연산 : 정수 4를 2^1 로 나누라는 의미 = 4 / (2^1) = 2
➡️우측 2 시프트 연산 : 정수 4를 2^2 로 나누라는 의미 = 4 / (2^2) = 1
➡️좌측 1 시프트 연산 : 정수 4를 2^1 로 곱하라는 의미 = 4 * (2^1) = 8
➡️좌측 2 시프트 연산 : 정수 4를 2^2 로 곱하라는 의미 = 4 * (2^2) = 16
💡컴퓨터는 2를 곱해달라는 명령이 내부적으로 시프트 연산을 하여 계산이 빠른 것
💡정리하자면 시프트하는 숫자의 값을 n이라고 하면,
좌측시프트는 2^n으로 나눈 결과
우측시프트는 2^n으로 곱한 결과
우측 양수화 시프트 ( >>> )
- 결과가 무조건 양수
➡️10000000 >>> 2를 하게 되면 00100000 가 된다.
➡️10000000 (음수)에서 우측 양수화 시프트의 결과값으로 00100000 (양수)가 나오는 것이다.
❓우측시프트, 우측 양수화 시프트 차이점
➡️10000000 >> 2
11100000 처럼 해당 부호비트와 같은 값(가장 좌측의 최상위 부호비트와 동일한 값)으로 채워지면서 옮겨진다.
➡️10000000 >>> 2
00100000 처럼 무조건 ’0’을 채우면서 옮겨진다.
▶️실습 - 우측시프트, 우측 양수화 시프트
11111111 11111111 11111111 11110000 (-16)
16 >> 3 (우측 3칸 시프트)
➡️11111111 11111111 11111111 11111110 (-2)
16 >>> 3 (우측 3칸 양수화 시프트)
➡️00011111 11111111 11111111 11111110 (536870910)
변경내용 있으면 수정예정 :)
'Programming > Java_자바' 카테고리의 다른 글
[Java 기초] yield (0) | 2025.01.13 |
---|---|
[Java 기초] 자바 변수 (0) | 2025.01.12 |
[Java 기초] '자바'를 공부하면서 알아야 할 것 (0) | 2024.12.01 |
[JAVA 기초] 내부클래스, '람다식' 이란? (0) | 2022.02.11 |
[JAVA 기초] Comparable 와 Comparator 인터페이스 (0) | 2022.01.17 |