sensor 에서 들어온 16진수(hex)를 10진수로 변환하여 보여줘야하는 상황이었다.
다만, 하나의 진수가 아닌 자릿수를 두 개로 나눠뒀다.
0xD3 0x01 이렇게 들어왔다면
0x01 이 더 높은 자리고 0xD3 이 더 낮은 자리다.
그러니까 조합하면 0x01D3 이 돼야한다.
일단 기본연산.
10진수라고 생각해보면
2453 이라는 천 단위 수가 있다고 했을 떄,
24와 53으로 나뉜다면
24 * 10^2 + 53 * 10^0 꼴이다.
10^0은 어차피 1이니 높은 자리 수에 진수^2 을 해주는게 핵심이다.
위 예시에서 0x01D3 이라면
16진수이므로
먼저 Byte 변수로 0x01 과 0xD3 을 담는다.
그 후 (0x01) * 16^2 + 0xD3 을 해주면 답이 나온다.
그런데,
Byte로 변환하려니 계속 음수가 나오는게 아닌가??
그래서 보니 0xFF 라는 Byte 변수를 출력하면 -1로 환산되는 식이었다.
0xFE 는 -2 ...
양수 128이 넘어가면 -128 부터 시작되는 느낌이다.
우선 이렇게 되는 이유는 Byte라는 변수가 -127부터 128 부터 취급하는 변수이기 때문이고,
255 까지 환산되는 16진수로 취급하려면
8비트 중 가장 첫번째 비트가 부호로 환산되는 것을 무시해야 한다.
그 방법은 사진과 같다.
0xFF (11111111) 라는 Byte 를 AND 연산(둘 다 1일 때만 1) 해주면
값은 동일하지만 4Byte 인 int 로 변환되면서
255까지 표현되는 것이다.
'Java' 카테고리의 다른 글
[Java] long 타입(milli 초 타임스탬프) 끼리 기간 차이 구하기(연, 월) feat. Calendar, Date (0) | 2022.07.10 |
---|---|
[Java] 10^-6 (micro) 초 까지 포맷에 맞춰 시간 출력하기 (0) | 2022.07.08 |
Infinity 의 함정 주의(Arithmetic Exception 으로 확인 불가 경우) (0) | 2022.01.26 |
[Java] interface 의 이해 (0) | 2021.02.10 |