많은 안드로이드 함수가 전달할 수있는 매개 변수가 비트 마스크이고 다른 옵션 (예 : PendingIntent)에서는 getActivity)로 PendingIntent.FLAG_CANCEL_CURRENT|PendingIntent.FLAG_NO_CREATE
.함수 또는 메서드에 대한 비트 마스크 매개 변수 만들기
이 같은 매개 변수가있는 함수를 어떻게 만들 수 있는지 궁금합니다.
많은 안드로이드 함수가 전달할 수있는 매개 변수가 비트 마스크이고 다른 옵션 (예 : PendingIntent)에서는 getActivity)로 PendingIntent.FLAG_CANCEL_CURRENT|PendingIntent.FLAG_NO_CREATE
.함수 또는 메서드에 대한 비트 마스크 매개 변수 만들기
이 같은 매개 변수가있는 함수를 어떻게 만들 수 있는지 궁금합니다.
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
}
}
그들은 2의 거듭 제곱에서 플래그를 정의하여 수동으로 수행됩니다. This file는 왼쪽 비트 시프트 연산자를 사용하지만 필요하지 않은 것 : 우리가 int 값을 하나의 < < (왼쪽 시프트)을 수행 할 때
public static final int FLAG_ONE_SHOT = 1<<30;
//...
public static final int FLAG_NO_CREATE = 1<<29;
는 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)). */
위의 두 답변 덕분에 나는 당신이 언급 한 방법이 어떻게 작용했는지에 대해 질문을 던졌고, 나는 위의 두 가지 대답에서 답을 얻었습니다. 실제 구현은 앞의 두 답변과 같이 작동합니다.