Неподписанный короткий в Java

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

Ответ 1

Ты не можешь, правда. Java не имеет никаких неподписанных типов данных, кроме char.

По общему признанию, вы можете использовать char - это 16-разрядный неподписанный тип, но это было бы ужасно в моем представлении, поскольку char явно предназначено для текста: когда код использует char, я ожидаю его использовать его для кодовых блоков UTF-16, представляющих текст, интересный для программы, а не произвольные беззнаковые 16-разрядные целые числа без отношения к тексту.

Ответ 2

Если вам действительно нужно значение с ровно 16 бит:

Решение 1: Используйте доступный подписанный короткий и стоп, беспокоясь о знаке, если вам не нужно сравнивать (<, < =, > , > =) или деление (/,%, → ). См. этот ответ о том, как обрабатывать подписанные номера, как если бы они были без знака.

Решение 2 (где решение 1 не применяется): Используйте младшие 16 бит int и удаляйте более высокие бит с помощью и 0xffff, если необходимо.

Ответ 3

Это действительно затхлый поток, но в интересах любого, кто придет после. char - это числовой тип. Он поддерживает все математические операторы, операции с битами и т.д. Это unsigned 16.

Мы обрабатываем сигналы, записанные пользовательским встроенным оборудованием, поэтому мы обрабатываем много неподписанных 16 из A-D. Мы много лет используем символы во всем мире и никогда не испытывали никаких проблем.

Ответ 4

Вы можете использовать char, так как это 16-значное значение без знака (хотя технически это символ Юникода, поэтому он мог бы быстро измениться, чтобы быть 24-битным значением в будущем)... другой альтернативой является использование int и убедитесь, что он находится в пределах диапазона.

Не используйте char - используйте int: -)

А вот ссылка обсуждающая Java и отсутствие без знака.

Ответ 5

Из DataInputStream.java

public final int readUnsignedShort() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (ch1 << 8) + (ch2 << 0);
}

Ответ 6

Нет такого типа в java

Ответ 7

Да, нет такой вещи, если вы хотите использовать значение в кодовых и битовых операциях.

Ответ 9

Нет, на самом деле такого метода не существует, Java - язык высокого уровня. Вот почему в Java нет неподписанных типов данных.

Ответ 10

Он сказал, что хочет создать многомерный короткий массив. Но никто не предложил поразрядных операторов? Из того, что я читал, вы хотите использовать 16-битные целые числа из 32-битных целых чисел для экономии памяти?

Итак, во-первых, чтобы начать 10 000 х 10000 коротких значений - 1600 000 000 бит, 200 000 000 байт, 200 000 килобайт, 200 мегабайт.

Если вам нужно что-то с потреблением памяти в 200 МБ, вы можете захотеть перепроектировать эту идею. Я также не считаю, что даже компиляция не говоря уже о побеге. Вы никогда не должны инициализировать такие большие массивы, если что-нибудь использует 2 функции, называемые On Demand Loading и кэширование данных. По сути, загрузка по требованию подразумевает идею загрузки данных по мере необходимости. Тогда кэширование данных делает то же самое, но использует пользовательскую работу фрейма для удаления старой памяти и добавления новой информации по мере необходимости. Это сложная задача, чтобы иметь высокую скорость работы. Есть и другие вещи, которые вы можете сделать, но эти двое - мои любимые, когда все сделано правильно.

Хорошо, что я говорил о побитовых операторах.

Итак, 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 может состоять из двух коротких значений.

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.

int assumed_value = 262143;

поэтому скажем, мы хотим получить два 16-битных целочисленных значения.

short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3

Также в основном думают о побитовых операциях как степени 2. Это все, что они на самом деле. Никогда не смотрите на его условия 0 и 1. Я в основном разместил это, чтобы помочь любому, кто может столкнуться с этим поиском беззнаковых коротких или даже, возможно, многомерных массивов. Если есть опечатка, я извиняюсь, быстро написал это.

Ответ 11

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

import static org.joou.Unsigned.*;

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

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

Ответ 12

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

Однако у Java есть тип данных 'byte'.

Ответ 13

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

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

Ответ 14

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

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, and Exclusive или ограниченные инструменты, когда все, что у вас есть, - это более длинные номера. Это особая проблема при взаимодействии с аппаратными устройствами, которые говорят об ошибках "REAL", которые составляют 16 бит или более. "char" не гарантированно работает (сейчас он равен двум байтам), но на нескольких восточных языках, например на китайском, корейском и японском языках, требуется не менее 3 байтов. Я не знаком с потребностью в количестве для языков стиля sandscript. Количество байтов не зависит от программиста, а от комитета по стандартам JAVA. Таким образом, базовый char, поскольку 16 бит имеет риск нисходящего потока. Чтобы безопасно реализовать беззнаковые шорты JAVA, особый класс является лучшим решением, основанным на вышеупомянутых неоднозначностях. Недостатком класса является неспособность перегрузить математические операции для этого специального класса. Многие из авторов этой темы точно указали на эти проблемы, но мой вклад - это пример рабочего кода и мой опыт работы с 3-байтными языками gif в С++ под Linux.

Ответ 15

//вот метод для получения аналога unsigned short
    public static int getShortU(byte [] arr, int i )  throws Exception 
    {
       try
       {
           byte [] b = new byte[2]; 
           b[1] = arr[i];
           b[0] = arr[i+1];
           int k = ByteBuffer.wrap(b).getShort();
            //if this: 
           //int k = ((int)b[0] << 8) + ((int)b[1] << 0); 
           //65536 = 2**16
           if ( k <0) k = 65536+ k; 
        return k;
      }  
       catch(Throwable t)
      {
          throw  new Exception ("from getShort: i=" + i);
      }
    }