java - 비트연산!
java 진수별 표현방식
java 에서 가장 작은 크기의 용량을 차지하는 자료형은 byte 이다(char 도 동일)
1byte(8bit) 를 차지한다.
boolean 타입도 1byte 크기이지만 cpu 단위상 어쩔수 없이 1byte 를 사용하는 것일뿐 표현방식이 다름으로 논외
8 bit 가 표기할 수 있는 데이터는 0000 0000 ~ 1111 1111
10진수로 표현하면 0 ~ 255 까지이다.
하지만 byte 에서 맨앞자리는 음수 부호로 사용된다.
1 | 0000 0000 ~ 0111 1111 (0 ~ 127) |
1 | public static void main(String[] args) { |
0x 는 16진수, 0b 는 2진수를 뜻한다.
over_hex_byte1, over_hex_byte2 변수의 경우 2진수 8개중 맨 앞자리(음수부호)를 1로 설정하였다.
(byte) 형변환 연산자를 설정하지 않으면 컴파일 에러가 뜨며
출력값을 보면 예상대로 음수값이 출력된다.
-128, -127 모두 byte 타입이 표현할 수 있는 수이지만 컴파일 에러를 출력하는 이유는
당연히 정수로 넘어갈 것이라 생각하는 개발자에 대한 배려라 생각된다.
1 | // 0000 1111 1111 1111 |
int 크기는 4byte 임으로 위처럼 설정할수 있다.
비트 연산
java 에서 비트연산을 주로 쓰는건 SHIFT, AND, OR 연산정도 일것
대충 사용법을 알아보자.
1 | // 0000 0001 |
예상대로 1씩 left shift 되면서 값이 증가한다.
이번엔 right shift 를 진행해보자.
1 | // 1000 0000 |
음수부호가 right shift 될 경우 예상치 못한 상황이 발생하는데
음수부호는 변경되지 않고 shift 가 되는점이다.
1 | // 0000 0001 |
위의 경우는 left shift 는 7번 시켜서 1000 0000 형태를 만드는것.
위의 경우와 마찬가지로 (byte) 형변환 이 필요하다.
예상했던 대로 진행되었다.
AND 연산과 OR 연산도 테스트해보자.
1 | byte b1 = 0b0111_0000; |
예상한 대로 동작한다.
1 | // 0111_0000 |
데모 코드
https://stackoverflow.com/questions/42913981/bit-array-to-byte-array
https://github.com/Kouzie/java-bit-operate-demo