Неподписанный короткий в Java - PullRequest
55 голосов
/ 03 декабря 2009

Как я могу объявить значение unsigned short в Java?

Ответы [ 15 ]

0 голосов
/ 15 декабря 2017

Если использование сторонней библиотеки является опцией, существует jOOU (библиотека выделения из jOOQ ), которая предлагает типы-оболочки для целых чисел без знака в Java. Это не совсем то же самое, что иметь поддержку примитивного типа (и, следовательно, байтового кода) для неподписанных типов, но, возможно, это все еще достаточно для вашего варианта использования.

import static org.joou.Unsigned.*;

// and then...
UShort s = ushort(1);

(Отказ от ответственности: я работаю в компании за этими библиотеками)

0 голосов
/ 03 февраля 2014

Он сказал, что хочет создать многомерный короткий массив. Еще никто не предлагал побитовые операторы? Из того, что я прочитал, вы хотите использовать 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. Я в основном разместил это, чтобы помочь любому, кто может столкнуться с этим поиском неподписанных коротких или даже, возможно, многомерных массивов. Если есть какие-либо опечатки, я прошу прощения быстро написал это.

0 голосов
/ 02 октября 2013

Простая программа, показывающая, зачем нужны беззнаковые числа:

package shifttest;
public class ShiftTest{
    public static void main(String[] args){
        short test = -15000;
        System.out.format ("0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n",
            test, test>>1, test>>2, test>>3, test>>4);
    }
}

Результаты:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56

Теперь для тех, кто не относится к системным типам:

JAVA делает арифметический сдвиг, потому что операнд подписан, однако есть случаи, когда логический сдвиг был бы уместным, но JAVA (в частности, Sun) посчитал это ненужным, что слишком плохо для нас из-за их близорукости. Shift, And, Or и Exclusive Or - это ограниченные инструменты, когда все, что у вас есть, подписано длинными номерами. Это является особой проблемой при взаимодействии с аппаратными устройствами, которые передают «РЕАЛЬНЫЕ» компьютерные биты размером 16 бит или более. «char» не гарантированно работает (теперь он имеет ширину в два байта), но в некоторых восточных gif-языках, таких как китайский, корейский и японский, требуется как минимум 3 байта. Я не знаком с количеством нуждающихся в языках стиля Sandscript. Количество байтов не зависит от программиста, а от комитета по стандартам для JAVA. Таким образом, основание char как 16 битов имеет нисходящий риск. Для безопасной реализации неподписанных шорт JAVA, так как специальный класс - лучшее решение, основанное на вышеупомянутых неясностях. Недостатком класса является невозможность перегрузки математических операций для этого специального класса. Многие из участников этой ветки точно указали на эти проблемы, но мой вклад - пример рабочего кода и мой опыт работы с 3-байтовыми языками GIF-файлов в C ++ под Linux.

0 голосов
/ 03 декабря 2009

Вы можете кодировать класс ShortUnsigned и определять методы для тех операторов, которые вам нужны. Вы не сможете перегрузить + и - и другие на них, а также не сможете выполнить неявное преобразование типов с другими примитивными или числовыми типами объектов, увы.

Как и некоторым другим ответчикам, я удивляюсь, почему у вас есть такая неотложная потребность в беззнаковых коротких данных, которые не будут заполнены никаким другим типом данных.

0 голосов
/ 03 декабря 2009

Java не имеет неподписанных типов. Для чего вам это нужно?

Однако в Java есть тип данных «byte».

...