Когда мы выполняем одиночное << (левое смещение) для значения 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)).
* /
Благодаря двум приведенным выше ответам у меня возник вопрос, как работают упомянутые вами методы. Я получил ответ из двух приведенных выше ответов. Реальная реализация работает так, как показано в предыдущих двух ответах.