Java에서 부울을 int로 변환


350

a booleanintJava 로 변환하는 가장 널리 사용되는 방법은 무엇입니까 ?


8
어떤 정수 당신이 맞습니다 생각 true하고 false각각?
Thorbjørn Ravn Andersen

4
일부 언어는 int에서 부울로 암시 적으로 변환됩니다. 자바는 그렇지 않습니다. 그러나 공식적인 구현에는 SQL 패키지가 있으며 이것이 "false"를 0으로 변환한다고 생각합니다.
hpique

4
@Peter Lawrey 숫자가 아닌 데이터 유형으로 부울이없는 다른 시스템과 상호 운용하려는 경우에는 적합하지 않습니다.
hpique

6
@Peter Lawrey 문제는 실제로 가치 매핑에 관한 것이 아닙니다. 가장 명확하고 수용 가능한 방식으로 변환을 수행하는 방법에 관한 것입니다.
hpique

7
기술적으로 Java 컴파일러는 이미 맵핑을 정의합니다. True와 False는 각각 1과 0으로 컴파일됩니다.
안티 모니

답변:


583
int myInt = myBoolean ? 1 : 0;

^^

PS : true = 1 및 false = 0


59
myBoolean이 부울 표현식을 나타내는 경우 괄호를 사용하는 것이 더 읽기 쉽습니다.
rsp

40
예, 같이 (foo && (!bar || baz)) ? 1 : 0. 분명히 그것이 식별자 일 경우, 파렌은 필요하지 않거나 바람직하지 않습니다.
Blrfl

부울과 좋은 트릭! 나는 어떤 캐스팅이 (int) true = 1과 같이 존재
할지 모르지만

1
나와 같은 초보자 (boolean expression) ? 1 : 0;에게는 더 이해할 수 있습니다. my접두사가 변수처럼 보이게 했다고 생각 합니다.
dixhom

12
예제 괄호 안의 @Blrfl 은 가독성 문제가 아닌 필수 입니다. foo && (!bar || baz) ? 1 : 0구문 오류입니다. (6 년이
지났다는


59

삼항 연산자를 사용하는 것은 원하는 것을 수행하는 가장 간단하고 효율적이며 읽기 쉬운 방법입니다. 이 솔루션을 사용하는 것이 좋습니다.

그러나 나는 대안 적이며, 고 안되고, 비효율적이며 읽을 수없는 대안을 제안하는 것에 저항 할 수 없다.

int boolToInt(Boolean b) {
    return b.compareTo(false);
}

이봐, 사람들은 멋진 답변에 투표하고 싶어!

편집하다

그건 그렇고, 나는 종종 두 가지 값 (일반적으로 compareTo방법 구현에서 )을 비교하기위한 목적으로 부울에서 int로 변환하는 것을 종종 보았습니다 . Boolean#compareTo그러한 특정한 경우에가는 길입니다.

편집 2

Java 7은 기본 유형과 직접 작동하는 새로운 유틸리티 기능을 도입했습니다 Boolean#compare(감사합니다 shmosel ).

int boolToInt(boolean b) {
    return Boolean.compare(b, false);
}

1
현대 JIT에 의해 인라인되므로 반드시 비효율적 일 필요는 없습니다. 또한 b.compareTo를 사용하여 읽을 수있는 이유를 설명합니다.
Thorbjørn Ravn Andersen

2
객체의 기본 값을 상자에 넣어야하기 때문에 속도가 느릴 수 있습니다. 삼항 연산자 방법은 변환없이 프리미티브 값과 직접 작동하므로 더 효율적이라고 생각합니다.
barjak

5
1. Boolean.compare()오토 박싱을 사용 하거나 피할 수 있습니다 . 2. 설명서는 Boolean.compareTo()1을 반환한다고 말하지 않고 "이 개체가 true를 나타내고 인수가 false를 나타내는 경우 양수"만 반환합니다.
shmosel

1
방금 1,000,000의 임의의 부울 값을 변환하는 테스트를 수행 했으며이 방법은 삼항 연산자를 사용하는 것보다 일관되게 빠릅니다. 약 10ms 가량 면도했습니다.
Mapsy

3
@AlexT. 미세 벤치 마크를 수행하는 경우 프레임 워크를 사용하여 올바르게 측정해야합니다. openjdk.java.net/projects/code-tools/jmh를 참조하십시오 .
Thorbjørn Ravn Andersen

48
boolean b = ....; 
int i = -("false".indexOf("" + b));

14
나는 이것이 대답이 아닌 의견으로 더 적합하다고 생각합니다.
hpique

164
5 - b.toString().length
kennytm

5
@ ThatbjørnRavnAndersen 그래. 오버 헤드가 필요없는 게시 된 다른보다 효율적인 방법 중 하나를 사용합니다. 부울 값을 단순히 확인하기 위해 문자열 객체를 생성하는 방법을 설명 할 수 없다면 어떤 식 으로든 효율적입니다.
b1nary.atr0phy

10
@ ThorbjørnRavnAndersen 나는 내 메소드가 어떻게 사용되는지 또는 얼마나 자주 호출되는지 제어 할 수 없다. 확실한 이점을 위해 성능과 가독성을 모두 희생하고 있습니다.
b1nary.atr0phy 2016 년

6
그것은 독창적이지만이 방법을 사용하는 것의 단일 이점을 생각할 수는 없습니다. 더 장황하고 (나는 추측하고 있습니다) 덜 효율적이지만 재미있는 방법입니다.
Mike Baxter

27
public int boolToInt(boolean b) {
    return b ? 1 : 0;
}

단순한


24
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;   
int y= BooleanUtils.toInteger(x);

FWIW BooleanUtils.toInteger는 그대로 구현됩니다 return bool ? 1 : 0;.
Solomon Ucko

아파치 커먼즈가 유용 할 수 있지만, 이것은 우스운 일입니다.
Eric Duminil

14

상황에 따라 다릅니다. 이해하기 쉽기 때문에 가장 간단한 방법이 가장 좋습니다.

if (something) {
    otherThing = 1;
} else {
    otherThing = 0;
}

또는

int otherThing = something ? 1 : 0;

그러나 때로는 부울 플래그 대신 Enum을 사용하는 것이 유용합니다. 동기식 및 비동기식 프로세스가 있다고 상상해보십시오.

Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());

Java에서 enum은 추가 속성 및 메소드를 가질 수 있습니다.

public enum Process {

    SYNCHRONOUS (0),
    ASYNCHRONOUS (1);

    private int code;
    private Process (int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

6
if 대신 if를 사용하는 또 다른 이유 ?:는 if 블록 안에 중단 점을 둘 수 있기 때문입니다 .
Thorbjørn Ravn Andersen

12

Apache Commons Lang 을 사용하는 경우 (많은 프로젝트에서 사용한다고 생각합니다) 다음과 같이 사용할 수 있습니다.

int myInt = BooleanUtils.toInteger(boolean_expression); 

toInteger메소드 boolean_expression는 true이면 1을 , 그렇지 않으면 0을 리턴합니다.


FWIW BooleanUtils.toInteger는 그대로 구현됩니다 return bool ? 1 : 0;.
Solomon Ucko

8

경우 true -> 1false -> 0매핑이 당신이 원하는, 당신은 할 수 있습니다 :

boolean b = true;
int i = b ? 1 : 0; // assigns 1 to i.

6

난독 화하려면 다음을 사용하십시오.

System.out.println( 1 & Boolean.hashCode( true ) >> 1 );  // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0

3

를 사용하여 트릭을 재생할 수 있습니다 Boolean.compare(boolean, boolean). 함수의 기본 동작 : 두 값이 모두 같으면 else를 반환 0합니다 -1.

public int valueOf(Boolean flag) {
   return Boolean.compare(flag, Boolean.TRUE) + 1;
}

설명 : 우리는 Boolean.compare의 기본 반환을 알다시피 -1 +1 메이크업 반환 값 때문에에 잘못 일치의 경우 0 에 대한 False1 에 대한True


3
Boolean.compare(myBoolean, false)인용 된 설명에 더 잘 맞을 것입니다
Vadzim

@Vadzim 예는 실제로 false와 비교하여 1과 0을 생성하며 현재 시나리오에서는 0과 -1을 생성합니다. 두 솔루션 모두 훌륭하고 귀하의 의견에 +1 :-)
mumair

0

값을 캐스팅하기 위해 if 문 주위에 래퍼 메서드를 작성해야한다는 사실은 java가 이미 죽어야하는 이유의 이미 큰 목록에 추가합니다. 그리고 삼항 연산자가 함수에 싸여 있지 않고 어디서나 붙여 넣기 만하면 부울 캐스트를 사용하여 견딜 수 있습니다. CPU 사이클을 낭비하고 코드 가독성을 모욕합니다.

또한 대부분의 답변에는 설명이없는 수백 개의 공감대가 있습니다. 나쁜 연습은 단지 자바에 너무 많이 노출 된 결과라고 생각합니다. 부울을 현대 언어로 int로 캐스팅하기 위해 삼항 연산자를 작성하면 다음 날 내가 할 수있는 일에서 해고 될 것입니다. 그래서 오늘 나는 자바 과제로 이유를 사용하려고 포기하고 어리 석음을 수용하기로 결정했습니다.

public static int booltoint(boolean nonsense) {
                                // Let's start with indenting using spaces, 16 of them to be precise
                                String[] ____int = new String[500];
                                ____int[0] = Boolean.toString(nonsense);
                                try {
                                                Thread.sleep(100); 
                                } catch (Exception e) {    }
                                Random rand = new Random();
                                int n = rand.nextInt((int)1e9);
                                int result = 0;
                                int other_Result = 1;
                                for (int i = -5; i < 2; i++) {
                                                try {
                                                                if (n == 35467247) return 5; // let's just fail with one in a billion chance
                                                                if ((5 - ____int[i].length()) == 1) {
                                                                                return ++result;
                                                                } else if(____int[i] == "false") {
                                                                                return --other_Result;
                                                                }
                                                } catch (Exception e) {
                                                                // This method will throw an exception 5 times every single time I 
                                                                // cast a boolean to int before returning an integer
                                                }
                                }
                                return (int)1e35;}

-1
public static int convBool(boolean b)
{
int convBool = 0;
if(b) convBool = 1;
return convBool;
}

그런 다음 사용하십시오 :

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