Как это называется?

1,921
107
378
Как называется такая многоходовочка в Java? Кто знает? Коротко расскажу что это такое:
этот код "сжимает" несколько int-переменных с диапазоном(указано в комментарии после переменной) в одну цифру, а потом раскладывает эти же числа обратно.
Java:
int a = 1; // range 0 - 1
int b = 0; // range 0 - 1
int c = 2; // range 0 - 3

int data = a + b * 4 + c * 16;

int aa = data % 4;
int bb = data / 4 % 2;
int cc = data / 16 % 16;

System.out.println(a + " " + b + " " + c + " - " + data + " - " + aa + " " + bb + " " + cc);
 
@MaximPixel, типа так вроде:
Java:
    public static void main(String[] args) {
        int a = 1; // range 0 - 1
        int b = 0; // range 0 - 1
        int c = 2; // range 0 - 3
     
        byte total = (byte)(c << 2 | b << 1 | a);
     
        int aa = total & 1;
        int bb = total >> 1 & 1;
        int cc = total >> 2;
     
        System.out.println("aa = " + aa + ", bb = " + bb + ", cc = " + cc + ".");
    }
---
Java:
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        byte c = 2; // range 0 - 3
        
        byte total = (byte)(c << 2 | (b ? 1 : 0) << 1 | (a ? 1 : 0));
        
        boolean aa = (total & 1) == 1;
        boolean bb = (total >> 1 & 1) == 1;
        byte cc = (byte)(total >> 2);
        
        System.out.println("aa = " + aa + ", bb = " + bb + ", cc = " + cc + ".");

    }
 
Это вроде "Битовые операции", нет?
 
@Doc, они тоже тут используются.
">>" и "<<" - битовый сдвиг,
" | " - битовая (логическая or) операция.
 
Последнее редактирование:
Оба примера кода основаны на одной идее: при заданных диапазонах значения переменных содержат значащих единиц и нуле меньше, чем вообще может влезать битов в один инт.
Поэтому, мы может просто расположить значащие биты каждого из трех чисел последовательно в одной переменной
 
Называется это packing. Точнее, логично так это называть.
Обычно битовые флажки суют в числовые переменные (1 байт может хранить 8 таких флажков), а также числа, которые, например, меньше байта (1 ниббл или 4 бита; таких 2 можно засунуть в байт, каждое от 0 до 15 будет)
 
зачем это надо?:confused:
 
Назад
Сверху