Written by
Sunwoo Han
on
on
3주차 피드백
해당 글을 백기선 님의 자바 스터디 3주차 과제를 공부하고 공유하기 위해서 작성되었습니다.
추가 질문
Q. 논리 연산자 두 개(&&)와 한 개(&)의 연산속도 차이는?
public class App {
public static void main(String[] args) {
int i = 0;
int j = 0;
if (i++ == 0 || j++ == 0) {
System.out.println("Hello");
}
System.out.println(i);
System.out.println(j);
}
}
public class App {
public static void main(String[] args) {
int i = 0;
int j = 0;
if (i++ == 0 | j++ == 0) {
System.out.println("Hello");
}
System.out.println(i);
System.out.println(j);
}
}
결과를 보면 알 수 있듯이 두 개 ||
일 때는 우측 피연산자를 검사하지 않고 한 개 |
일 때는 우측까지 검사한다.
Q. 가운데 값(mid value)을 구할 때 오버플로우를 막으려면?
public class App {
public static void main(String[] args) {
int start = 2_000_000_000;
int end = 2_100_000_000;
int mid = (start + end) / 2;
System.out.println(mid);
}
}
위 코드를 실행하면 오버플로우가 발생하여 원하는 값이 나오지 않는다. 오버플로우 없이 안전하게 값을 구하는 방법 2가지가 있다.
<첫번째>
public class App {
public static void main(String[] args) {
int start = 2_000_000_000;
int end = 2_100_000_000;
int mid = start + (end - start) / 2;
System.out.println(mid);
}
}
낮은 값을 베이스로 하고 두 수의 차의 반을 베이스에 더하는 것이기 때문에 어렵지 않다.
<두번째>
public class App {
public static void main(String[] args) {
int start = 2_000_000_000;
int end = 2_100_000_000;
int mid = (start + end) >>> 1;
System.out.println(mid);
}
}
비트연산자에서 >>>
는 빈자리를 0으로 채운다. >>
와 차이는 부호의 변경 유무이다. >>
는 최상위 부호비트 값으로 채워지지만, >>>
는 무조건 0으로 채워진다. 1만큼 이동, 즉 2로 나누는 것과 같기 때문에 중간 값을 구하는 연산이 되는 것이다.
Q. 다음 문제를 풀어라.
numbers라는 int형 배열이 있다. 해당 배열에 들어있는 숫자들은 오직 한 숫자를 제외하고 모두 두 번씩 들어있다. 오직 한 번만 등장하는 숫자를 찾는 코드를 작성하라.
public class App {
public static void main(String[] args) {
App app = new App();
int result = app.solution(new int[] { 5, 2, 4, 1, 2, 4, 5 });
System.out.println(result);
}
private int solution(int[] numbers) {
int result = 0;
for (int number : numbers) {
result ^= number;
}
return result;
}
}
XOR ^
는 자기자신과 다를 경우 1을 반환한다. 중복되지 않는 숫자를 찾기에 좋은 비트 연산자이다.
Reference
Comments
JAVA STUDY HALLE 의 다른 글
-
15주차 피드백 06 Mar 2021
-
15주차 과제: 람다식. 28 Feb 2021
-
14주차 피드백 27 Feb 2021
-
14주차 과제: 제네릭. 22 Feb 2021
-
13주차 피드백 20 Feb 2021
-
13주차 과제: I/O. 08 Feb 2021
-
12주차 피드백 06 Feb 2021
-
12주차 과제: 애노테이션. 01 Feb 2021
-
11주차 피드백 30 Jan 2021
-
11주차 과제: Enum. 24 Jan 2021
-
10주차 피드백 23 Jan 2021
-
10주차 과제: 멀티쓰레드 프로그래밍. 18 Jan 2021
-
9주차 피드백 16 Jan 2021
-
9주차 과제: 예외 처리. 10 Jan 2021
-
8주차 피드백 09 Jan 2021
-
8주차 과제: 인터페이스. 03 Jan 2021
-
7주차 피드백 02 Jan 2021
-
7주차 과제: 패키지. 28 Dec 2020
-
6주차 피드백 27 Dec 2020
-
6주차 과제: 상속. 21 Dec 2020
-
5주차 피드백 20 Dec 2020
-
5주차 과제: 클래스. 14 Dec 2020
-
4주차 피드백 13 Dec 2020
-
4주차 과제: 제어문. 30 Nov 2020
-
3주차 피드백 29 Nov 2020
-
3주차 과제: 연산자. 22 Nov 2020
-
2주차 피드백 21 Nov 2020
-
2주차 과제: 자바 데이터 타입, 변수 그리고 배열. 15 Nov 2020
-
1주차 피드백 15 Nov 2020
-
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. 08 Nov 2020