ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 에서 비트연산자를 사용한 byte 양수표현 및 0xff 사용법
    개발/java 2022. 4. 10. 23:04
    반응형

    자바에서 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 이라고 마이너스로 인식하는 일따위는 없어지게 되는 것이다.

     

    '개발/java' 카테고리의 글 목록

     

    emflant.tistory.com

    반응형

    댓글

Designed by Tistory.