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


85

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

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


2
참고로 거의 모든 프로그래밍 언어에서 관용구는 실제 이진 문자열이 아닌 16 진수로 이진 상수를 쓰는 것입니다.
— abyx 2009

3
맞습니다.하지만 바이너리에 문제가있어서가 아니라 16 진수가 사용 가능한 가장 가까운 것이기 때문이라고 생각합니다. 이진 리터럴을 지원하는 언어에서이 기능을 무시하는 것이 관례라고 생각하지 않습니다.
— Ken


2017 년 : 허용되는 답변은 Russ가 제공 한 것이어야합니다. 참조 : stackoverflow.com/a/1692932/716079
— Lourenco

답변:


65

따라서 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) 시험 마스터 링


3
왜 바이트 데이터 = 0b0000110011입니까? 10 비트가 있습니까? 저는 프로그래밍에 익숙하지 않지만 8 비트 바이트 데이터 유형에 맞추려면 0b00110011처럼 보일 것이라고 생각합니다.
— Mike

1
Mike와 같은 것을 궁금해하는 사람은 컴파일러가이를 나타내는 숫자로 변환하기 때문입니다. 수십 개의 선행 0을 가질 수 있으며 실제 값에는 영향을주지 않습니다. 컴파일 과정은 본질적으로 거기에 십진수를 쓴 것과 같습니다.
— 루크 브릭스

1
정의에 따라 기본 유형 바이트는 -128 ~ 127 (-128 ~ -1 & 0 ~ 127) 사이의 256 개의 숫자를 저장할 수 있습니다. 그러나 바이너리 리터럴을 사용하여 -128을 나타내는 방법. 예를 들어 바이트 b = -0b1111111; -127을 나타내지 만 -128은 어떻습니까?
— nirmalsingh

152

Java 7 :

int i = 0b10101010;

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


33
또한 _시퀀스를 더 읽기 쉽게 만드는 문자가 있을 수 있음을 지적하고 싶습니다 . int i = 0b1010_1010_0011;
— user12345613

@Russ 여기서 0b는 무엇을 의미합니까? Java 7에서이 기능은 무엇입니까?
— Geek

1
0b는 바이너리를 의미합니다. 이 기능은 바이너리 리터럴이라고 : docs.oracle.com/javase/7/docs/technotes/guides/language/...
— 러스 헤이워드

1
이 새로운 이진 데이터 표현을 좋아합니다. 문자열 표현은 읽기가 매우 어렵습니다. 수락 된 답변과 "@ user12345613"의 답변의 차이를 확인하세요. 그를 위해 +1.
— Marcello de Sales

54

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

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

1
다른 용도 중에서도 선 및 다각형 래스터 화를위한 점묘 패턴은 여러 인기 그래픽 라이브러리에서 정수로 지정됩니다. parseInt 또는 parseShort를 사용하면 개발자가 패턴을 쉽게 시각화 할 수 있습니다.
— charstar

5
Java 7부터 Russ Hayward의 대답이 정답입니다. Java 7 이전에는 온라인 도구 또는 자주 사용하는 계산기를 사용하여 바이너리를 이전 Java 버전 (8 진수, 10 진수 또는 16 진수)에서 인식하는 표기법 중 하나로 변환 할 수 있습니다. 다른 기수가 사용되는 경우 이진 표현을 포함하는 설명 주석을 선언에 배치하여 독자를위한 값을 명확히 할 수 있습니다.
— Jason C

이것은 다소 더러운 해결책이지 않습니까? 1 바이트를 나타내는 데 16 바이트를 사용하고 있습니다 (두 번째 인수와 변환은 계산하지 않음). 물론 컴파일러가 이것을 최적화하지 않는 한 나는 의심합니다.
— Tomáš Zato-Monica 복원 2014-04-24

@ TomášZato : 예, 그렇습니다.하지만이 답변을 작성할 때 언어가 이진 리터럴을 지원하지 않았다는 점을 감안할 때 어떤 해결책을 제안 하시겠습니까? Russ Hayward는 지금 받아 들인 대답을 가져야합니다.
— Ed S.

나는 편안함을 포기하고 정수를 사용하는 것이 좋습니다. 변수 정의 자체에서는 괜찮지 만이 대답은 사용자가 루프 등에 대해이 접근 방식을 사용하도록 동기를 부여 할 수 있습니다. 그리고 일반적으로 프로그래머는 성능을 위해 자신의 편안함을 포기해야한다고 생각합니다.
— Tomáš Zato-Monica 복원 2014 년

18

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에서 계속 사용할 수 있습니다.


훌륭한 솔루션! (최종 정적 공용 긴 mask12 = 1L << 12)
— Jyro117

17

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

상수 선언 :

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
}

12

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

8 진수 구문 (번호 접두사 0), 10 진수 구문 및 "0x"접두사가있는 16 진수 구문이 있습니다. 그러나 이진 표기법에 대한 구문은 없습니다.

몇 가지 예 :

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

1
이것은 질문에 대한 답이 아닙니다.
— Michael McQuade

2017 년 : 다행히 이진 표현에 대한 표기법이 있습니다. "0b"로 시작합니다. 예 : byte b = 0b01000001(더 나은 가독성을 위해 byte b = 0b0100_0001).
— Lourenco

2

많은 바이너리를 엉망으로 만들고 싶다면 몇 가지 상수를 정의 할 수 있습니다.

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

기타

또는

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

0

약간 더 어색한 대답 :

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() + "\"" );
    }

}

[java] bb를 2로 출력하고 값은 "2"입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.