티스토리 뷰
자바에서 byte 자료형의 범위는 -128 ~ 127 이다. 8개의 비트를 사용하니 256까지 표현하리라 착각하기 쉽다. 하지만 byte 의 맨 앞의 비트는 부호를 표현하기때문에 사실상 7개의 비트로만 수를 표현하게 된다. 간단한 예를 들어보자.
int n = 150;
System.out.println(Integer.toBinaryString(n)); //returns 10010110
byte b = (byte) n;
System.out.println(b); // returns -106
byte 자료형의 범위가 음수, 양수 모두 표현하려다보니 부득이하게 127을 넘어서는 숫자부터 음수로 인식을 하게 된다. 150이라는 int 형 숫자(=10010110)에서 보듯 맨앞의 비트가 1이므로 음수로 인식해서 -106 이라는 숫자가 리턴된다. 여기서 변함없는 것은 10010110 이라는 비트열이다. 이 byte 를 150으로 보이게 할 수 있는 방법이 없을까. 다시말해 -128~127 의 범위가 아닌 0 ~ 255 의 범위의 숫자로 표현할 수 있을까.
비트연산자 "&"
결론은 아래의 결과에서 보듯이 가능하다.
int n = 150;
System.out.println(Integer.toBinaryString(n)); //returns 10010110
byte b = (byte) n;
System.out.println(b); // returns -106
System.out.println(b & 0xff); // returns 150
마지막 줄에 의미하는 0xff 는 표현식을 16진수로 했을 뿐이지 십진수 255, 이진수 11111111 라는 숫자일뿐이다. 아무 이진수를 가지고 이진수 11111111 과 & 비트연산자를 사용해서 연산하면 무조건 같은 값이 나올텐데 왜 저런짓을 할까.
11111111111111111111111110010110
00000000000000000000000011111111
--------------------------------
00000000000000000000000010010110
0xff(=255) 는 int 형이며 10010110 이라는 byte형은 연산전에 int 형으로 형변환되어 위와 같이 & 비트 연산을 하게 된다. int 형은 4바이트 데이터형식이며, 32자리 비트중 맨 뒤에서 8번째 비트가 1 이라고 마이너스로 인식하는 일따위는 없어지게 되는 것이다.
- Total
- Today
- Yesterday
- MongoDB
- eclipse
- R
- docker
- 마인크래프트
- python
- 아이맥
- MySQL
- javascript
- ipTIME
- 자급제폰
- 막대그래프
- ggplot
- Oracle
- Google Chart Tools
- MyBatis
- 맥북
- heroku
- java
- 알뜰요금제
- vagrant
- 도넛차트
- ubuntu
- 이클립스
- ktm모바일
- ggplot2
- 셀프개통
- SVN
- Spring
- github
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |