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

카테고리:

업데이트: