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