Он сказал, что хочет создать многомерный короткий массив. Еще никто не предлагал побитовые операторы? Из того, что я прочитал, вы хотите использовать 16-битные целые по 32-битным целым для экономии памяти?
Итак, во-первых, для начала 10 000 x 10 000 коротких значений - это 1 600 000 000 битов, 200 000 000 байтов, 200 000 килобайт, 200 мегабайт.
Если вам нужно что-то с потреблением 200 МБ памяти, вы можете изменить эту идею. Я тоже не верю, что буду даже компилировать, не говоря уже о запуске. Вы никогда не должны инициализировать большие массивы, как это, если что-либо использует 2 функции, называемые загрузкой по требованию и кэшированием данных. По сути, загрузка по требованию относится к идее загружать данные только по мере необходимости. Затем кэширование данных делает то же самое, но использует пользовательскую работу с кадрами для удаления старой памяти и добавления новой информации по мере необходимости. Это сложно, чтобы иметь хорошие показатели скорости. Есть и другие вещи, которые вы можете сделать, но эти две мои любимые, когда все сделано правильно.
Хорошо, вернемся к тому, что я говорил о побитовых операторах.
Итак, 32-битное целое число или в Java "int". Вы можете хранить то, что называется «битами», так что, скажем, у вас было 32 логических значения, которые в Java все значения занимают 32 бита (кроме длинных), или для массивов они принимают 8 для байтов, 16 для коротких и 32 для int , Таким образом, если у вас нет массивов, вы не получите никакой выгоды от памяти, используя байт или шорт. Это не означает, что вы не должны использовать его как способ убедиться, что вы и другие пользователи знают диапазон данных, который должно иметь это значение.
Теперь, как я уже говорил, вы можете эффективно хранить 32 логических значения в одно целое число, выполнив следующие действия:
int many_booleans = -1; //All are true;
int many_booleans = 0; //All are false;
int many_booleans = 1 | 2 | 8; //Bits 1, 2, and 4 are true the rest are false;
Итак, теперь короткое замыкание состоит из 16 битов, поэтому 16 + 16 = 32, что идеально соответствует 32-битному целому числу. Таким образом, каждое значение типа int может состоять из 2 коротких значений.
int two_shorts = value | (value2 << 16);
Итак, что делает вышеприведенное, так это значение что-то между -32768 и 32767 или как значение без знака 0 - 65535. Итак, допустим, значение равно -1, так что как значение без знака это было 65535. Это будет означать биты с 1 по 16 включены, но при фактическом выполнении математики учитывают диапазон 0 - 15.
Итак, нам нужно активировать биты 17 - 32. Поэтому мы должны начать с чего-то большего, чем 15 бит. Итак, мы начинаем с 16 бит. Итак, взяв значение 2 и умножив его на 65536, что и делает «<< 16». Теперь у нас есть, скажем, значение2 равно 3, это будет OR'd 3x65536 = 196608. Таким образом, наше целочисленное значение будет равно 262143. </p>
int assumed_value = 262143;
Допустим, мы хотим получить два 16-битных целочисленных значения.
short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3
Также, в основном, считают побитовые операторы степенями 2. Это все, что они есть на самом деле. Никогда не смотрите на это с точки зрения 0 и 1. Я в основном разместил это, чтобы помочь любому, кто может столкнуться с этим поиском неподписанных коротких или даже, возможно, многомерных массивов. Если есть какие-либо опечатки, я прошу прощения быстро написал это.