Создание параметра битовой маски для функции или метода - PullRequest
5 голосов
/ 30 апреля 2010

Я заметил, что во многих функциях Android есть параметр, который вы можете передать в виде битовой маски, для различных опций, например, в PendingIntent, вы можете передавать такие вещи, как вызов getActivity () с PendingIntent.FLAG_CANCEL_CURRENT|PendingIntent.FLAG_NO_CREATE.

Мне интересно, как я могу создать функцию с таким параметром?

Ответы [ 3 ]

10 голосов
/ 01 мая 2010
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 голос
/ 30 апреля 2010

Они сделаны вручную, просто определяя флаги в степени двух. Этот файл использует левый оператор сдвига битов, но это не обязательно:

public static final int FLAG_ONE_SHOT = 1<<30;
//...
public static final int FLAG_NO_CREATE = 1<<29;
0 голосов
/ 06 марта 2018

Когда мы выполняем одиночное << (левое смещение) для значения int, двоичное представление значения int получает 0 справа, а самый левый бит отбрасывается, это имеет эффект исходного значения двойное значение int означает, что после каждого сдвига влево мы получим двойное значение от исходного значения, это хорошо работает до тех пор, пока 31-е индексированное (начиная индексирование с 0 справа) самое левое значение не будет установлено равным 1 из-за использования <<, в этом случае вместо значения, которое в два раза больше исходного, оно становится отрицательным значением типа int. </p>

Теперь все положительные степени 2 равны 1,2,4,8,16,32, ......, 1073741824 для значений типа int. Эти значения содержат только один «1» в двоичном представлении по некоторому индексу.

Это приносит прибыль, когда вы | (поразрядно или) любые две из этих степеней 2, соответствующие индексы «1» для обоих значений устанавливаются в «1» в результирующем значении.

например, 8 (1000) имеет 1 в индексе 3, а 2 (10) имеет 1 в индексе 1, когда мы | (или) их мы получаем 1010 в двоичном виде, что означает, что индексированные биты 1 и 3 установлены в 1.

Так что, если вы хотите проверить, какие флаги объединены, вам нужно проверить только индексы '1'.

Например-

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;
    }

/ * Например, если метод принятия решения возвращает массив, который содержит {6,3,1,0,0,0}, то это означает, что флаги test6, test3 и test1 назначены (решение (test6 | test3 | test1)). * /

Благодаря двум приведенным выше ответам у меня возник вопрос, как работают упомянутые вами методы. Я получил ответ из двух приведенных выше ответов. Реальная реализация работает так, как показано в предыдущих двух ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...