developer tip

Java에서 이진 형식으로 정수 상수를 정의 할 수 있습니까?

copycodes 2020. 9. 17. 08:03
반응형

Java에서 이진 형식으로 정수 상수를 정의 할 수 있습니까?


16 진수 또는 8 진수로 정수 상수를 정의하는 방법과 비슷하게 이진수로 할 수 있습니까?

나는 이것이 정말 쉽고 어리석은 질문임을 인정합니다. 내 Google 검색이 비어 있습니다.


따라서 Java SE 7이 출시되면서 바이너리 표기법이 기본적으로 제공됩니다. 바이너리에 대한 적절한 이해가 있다면 구문은 매우 간단하고 분명합니다.

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;

특히 클래스 수준 변수를 바이너리로 선언 할 때 바이너리 표기법을 사용하여 정적 변수를 초기화하는 데 전혀 문제가 없습니다.

public static final int thingy = 0b0101;

너무 많은 데이터로 숫자를 넘치지 않도록주의하십시오. 그렇지 않으면 컴파일러 오류가 발생합니다.

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte

이제 정말 멋지게 만들고 싶다면 숫자 리터럴로 알려진 Java 7의 다른 깔끔한 새 기능을 밑줄과 결합 할 수 있습니다. 리터럴 밑줄이있는 이진 표기법의 다음 멋진 예를 살펴보십시오.

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;

가독성은 말할 것도없고 멋지고 깔끔하지 않나요?

나는 TheServerSide에서 주제에 대해 작성한 작은 기사에서 이러한 코드 조각을 가져 왔습니다. 자세한 내용은 자유롭게 확인하십시오.

Java 7 및 이진 표기법 : OCP JP (Java Programmer) 시험 마스터 링


Java 7 :

int i = 0b10101010;

이전 버전의 Java에는 이진 리터럴이 없습니다 (대안은 다른 답변 참조).


Java에는 바이너리 리터럴이 없지만이 작업을 수행 할 수 있다고 가정합니다 (요점은 모르겠지만).

int a = Integer.parseInt("10101010", 2);

Ed Swangren의 답변

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);

잘 작동합니다. long대신 사용 int하고 수정자를 추가하여 비트 마스크로 가능한 사용을 명확히했습니다. 하지만이 접근 방식에는 두 가지 불편 함이 있습니다.

  1. 이 모든 0을 직접 입력하면 오류가 발생하기 쉽습니다.
  2. 결과는 개발 당시 10 진수 또는 16 진수 형식으로 제공되지 않습니다.

대안 적 접근을 제안 할 수 있습니다

public final static long mask12 = 1L << 12;

이 표현은 12 번째 비트가 1이라는 것을 분명하게합니다 (카운트는 0부터 시작하여 오른쪽에서 왼쪽으로). 마우스 커서를 가리키면 툴팁이

long YourClassName.mask12 = 4096 [0x1000]

Eclipse에 나타납니다. 다음과 같이 더 복잡한 상수를 정의 할 수 있습니다.

public final static long maskForSomething = mask12 | mask3 | mask0;

또는 명시 적으로

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);

변수의 값은 maskForSomething개발시 Eclipse에서 계속 사용할 수 있습니다.


이진 상수를 사용하여 마스킹

상수 선언 :

public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;

그리고 그들을 사용

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}

Google에서 "Java literals syntax"를 검색하면 몇 가지 항목이 나타납니다.

There is an octal syntax (prefix your number with 0), decimal syntax and hexadecimal syntax with a "0x" prefix. But no syntax for binary notation.

Some examples:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case

If you want to mess around with lots of binary you could define some constants:

public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;

etc.

or

public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;

Slightly more awkward answer:

public class Main {

    public static void main(String[] args) {
        byte b = Byte.parseByte("10", 2);
        Byte bb = new Byte(b);
        System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" );
    }

}

which outputs [java] bb should be 2, value is "2"

참고URL : https://stackoverflow.com/questions/867365/in-java-can-i-define-an-integer-constant-in-binary-format

반응형