백기선님 스터디에서 배운거 2가지 (간략히 정리)
- 프로그래밍 언어/자바
- 2020. 11. 29. 08:30
반응형
반응형
1.<<<
가운데 값을 구할때 자바 같은 정적 타입 언어는 오버 플로우가 발생할 수 있다.
public void shift () {
int max = Integer.MAX_VALUE;
int value = 10000000;
System.out.println((max+value)/2);
}
이렇게 발생하는 이유는 더하기를 하게 되는 순간 오버플로우가 발생하고 그 오버플로우발생한 것들을 2로 나눈 결과이기 때문입니다.
이것을 해결하기 위해서는 2가지 방법을 사용할 수 있다.
1) value + (max-value)/2 사용
=> 결과 1078741823
이것이 가능한 이유는 작은 숫자로 생각해 보자.
value를 4로 두고 max를 100으로 두자.. 그러면 104니까 답은 52가 된다.
이것을 위식에 대입해 보자.
4 + (100-4)/2 이렇게 답이 나온다. 지금은 완벽한 설명이 힘들것 같아 이렇게 종료한다. 결국은 답이 일치하게 되는 상황이 발생하였다.
2) <<< 활용
이 방법이 가능한 이유는 더한뒤 그 비트를 왼쪽으로 한칸씩 옮겼기 때문이다. 그리고 양수로 만들기 위해 << 가 아닌 <<<로 작성하였다.
2. ^ 활용
백기선님이 스터디에서 1문제를 내주셨다.
어떠한 int배열이 존재하는데 단 한개만 짝이 없는 숫자라 할때 그 숫자가 무엇인지 구해라...|
[1,1,2,4,5,5,4] => 답 : 2
public int xor(int[] array) {
int answer = 0;
for (int value : array) {
answer ^= value;
}
return answer;
}
이것은 ^ 즉 xor를 활용한것인데
xor의 특징이 상호 배타적이라는 것이다.
결국 같으면 0이 나오고 다르면 그숫자가 나온다는 의미다. 이건 조금 더 해봐야 알 것 같지만... .ㅎㅎ;;
추가+)
문제 :
int i = 0; int j = 0;
if (i++ == 0 || j++ == 0) {
}
System.out.println(i);
System.out.println(j);
???
int i = 0; int j = 0;
if (i++ == 0 | j++ == 0) {
}
System.out.println(i);
System.out.println(j);
????
생각해볼것
반응형