Study/java

[Java] Integer - bitCount 2진수 관련 메서드 사용법

 

Integer 클래스에서 비트를 다루는 메서드에 대해 살펴보려고 합니다.

 

bitCount(int i)

int i = 12345;
System.out.println("12345 binary : " + Integer.toString(i, 2));
System.out.println("bitCount : " + Integer.bitCount(i));

bitCount 사용결과

bitCount는 정수를 2진수로 변환한 뒤 1 비트의 개수를 반환합니다.

내부 로직에서는 이진수로 변환은 하지 않고 shift 연산자를 이용해서 밀어버립니다.

 

highestOneBit(int i), lowestOneBit(int i)

int i = 12345;
System.out.println("highestOneBit : " + Integer.highestOneBit(i));
System.out.println("lowestOneBit : " + Integer.lowestOneBit(i));

highest, lowestOneBit 사용결과

highestOneBit는 제일 왼쪽에 있는 1비트의 값을 반환하고 lowestOneBit는 제일 오른쪽에 있는 1비트의 값을 반환합니다.

 

예시의 코드 결과를 설명하자면, 12345를 이진수로 변환하면 11000000111001입니다.

lowestOneBit는 가장 오른쪽에 있는 1비트가 2의 0 제곱 위치에 있기 때문에 1입니다.

highestOneBit는 가장 왼쪽에 있는 1비트가 2의 13제곱 위치에 있기 때문에 8192입니다.

두 메소드 모두 1비트가 없으면(0이면) 0을 반환합니다.

16의 경우 highest, lowest 둘 다 16이 반환됩니다.

 

 

 

 

numberOfLeadingZeros(int i), numberOfTrailingZeros(int i)

int i = 12345;
System.out.println("numberOfLeadingZeros : " + Integer.numberOfLeadingZeros(i));
System.out.println("numberOfTrailingZeros : " + Integer.numberOfTrailingZeros(i));

numberOfLeading, TrailingZero 사용결과

numberOfLeadingZeros는 정수를 2진수로 바꿨을 때 가장 왼쪽에 있는 1비트 이전의 0비트 수를 반환합니다.

numberOfTrailingZeros는 반대로 가장 오른쪽에 있는 1비트 이후의 0비트 수를 반환합니다.

 

12345를 넣은 결과가 왜 18과 0인지 파악해보자면, 우선 int 타입의 비트 수는 32입니다.

12345를 2진수로 바꾸면 11000000111001이지만 사실은 0000 0000 0000 0000 0011 0000 0011 1001입니다.

가장 왼쪽에 있는 1비트는 14번째에 있습니다.

그래서 14번째의 왼쪽에 있는 0비트의 수는 18개가 됩니다.

그 반대의 경우 가장 오른쪽에 있는 1은 1번째에 존재합니다.

그래서 1번째 이전의 0비트 수는 없기 때문에 0이 반환됩니다.

16을 넣으면 LeadingZeros는 27, TrailingZeros는 4가 나옵니다.

 

int 타입의 비트 수는 32이기때문에 0을 넣으면 두 메서드 모두 32가 반환됩니다.