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.