2010-04-30 2 views

답변

10
public static final int FLAG_1 = 1<<0; // 0x01 
public static final int FLAG_2 = 1<<1; // 0x02 
public static final int FLAG_3 = 1<<2; // 0x04 
public static final int FLAG_4 = 1<<3; // 0x08 

public void myFlagsFunction(int flags) { 
    if (0 != (flags & FLAG_1)) { 
    // do stuff 
    } 
    if (0 != (flags & FLAG_2)) { 
    // do stuff 
    } 
} 
1

그들은 2의 거듭 제곱에서 플래그를 정의하여 수동으로 수행됩니다. This file는 왼쪽 비트 시프트 연산자를 사용하지만 필요하지 않은 것 : 우리가 int 값을 하나의 < < (왼쪽 시프트)을 수행 할 때

public static final int FLAG_ONE_SHOT = 1<<30; 
//... 
public static final int FLAG_NO_CREATE = 1<<29; 
0

는 int 값의 이진 표현은 0을 얻는다 오른쪽에서 가장 왼쪽 비트는 버려집니다. int의 원래 값이 두 배가되는 효과가 있습니다. 즉, 왼쪽으로 한 번 이동 한 후에 원래 값의 두 배가됩니다. 이것은 31 번째 인덱스가 시작될 때까지 잘 작동합니다 0에서 오른쪽으로 인덱싱)은 < <의 사용으로 인해 1로 설정된 값을 남겨 둡니다.이 경우 값이 원래 beco의 두 배가되는 대신 mes - 부의 int 치

이제 2의 모든 양수는 int 값의 경우 1,2,4,8,16,32, ......, 1073741824입니다. 이 값은 일부 인덱스에서 이진 표현에 '1'을 하나만 포함합니다.

이것은 이익을 얻을 때 | 이 비트 수 2의 임의의 2 개 (비트 단위 또는)에 대해서, 양쪽 모두의 값에 대응하는 「1」의 인덱스는 결과의 값으로 '1'로 설정됩니다.

예를 들어 8 (1000)은 인덱스 3에서 1을 가지며 2 (10)은 인덱스 1에서 1을가집니다. (또는) 우리는 이진수로 1010을 얻습니다. 이는 1과 3의 색인 된 비트가 모두 1로 설정됨을 의미합니다.

따라서 어떤 플래그가 결합되어 있는지 확인하려면 '1 's. 예 -

static int test0= 1; 
static int test1= 2; 
static int test2= 4; 
static int test3= 8; 
static int test4= 16; 
static int test5= 32; 
static int test6= 64; 
int[] result; 
int[] decision(int flags){ 
    char[] x=Integer.toBinaryString(flags).toCharArray(); 
    result=new int[x.length]; 
    for(int i=x.length-1,j=0,k=0;i>=0;i--) 
     switch (x[k++]){ 
      case '0': 
      break; 
      case '1': 
      if(i==0){ 
       result[j++]=-1; //for ...000001 (test0) put -1 into the array instead of the value of i which is 0. 
       break; 
      } 
      result[j++]=i; 
      }; 
     return result; 
    } 

/* 예를 들어, 판정 방법은 TEST6, TEST3 및 TEST1을 의미 다음 {6,3,1,0,0,0}를 포함하는 배열을 반환하는 경우

들어 플래그는 or-ed입니다 (decision (test6 | test3 | test1)). */

위의 두 답변 덕분에 나는 당신이 언급 한 방법이 어떻게 작용했는지에 대해 질문을 던졌고, 나는 위의 두 가지 대답에서 답을 얻었습니다. 실제 구현은 앞의 두 답변과 같이 작동합니다.