Беззнаковая арифметика в Java
Преобразование byte в short (int, long)
Обычный каст (int) myByte выполнит расширение до 32 бит со знаком — это означает, что если старший бит байта был установлен в 1, то результатом будет то же самое отрицательное число, но записанное в 32-битном формате:
Сравнение без учёта знака
Для беззнакового сравнения есть лаконичная формула:
Сложение, вычитание и умножение
А вот здесь приятный сюрприз — эти операции выполняются корректно в любом случае. Но в выражениях необходимо тщательно следить за тем, чтобы операции выполнялись с числами одного типа, так как любые неявные преобразования выполняются с расширением знака, и могут приводить к результатам, отличным от ожидаемых. Коварство таких багов в том, что ошибочный сценарий может выполняться очень редко.
Деление
Чтобы код компилировался, придётся также позаимствовать реализацию compare(long, long) :
и Longs.compare(long, long) + flip(long) :
Побитовые сдвиги
The shift arithmetic left (SAL) and shift logical left (SHL) instructions perform the same operation; they shift the bits in the destination operand to the left (toward more significant bit locations). For each shift count, the most significant bit of the destination operand is shifted into the CF flag, and the least significant bit is cleared (see Figure 7-7 in the Intel®64 and IA-32 Architectures Software Developer’sManual, Volume 1).
То есть SAL добавили просто для симметрии, с учётом того, что для сдвига вправо есть разделение на логический и арифметический. Ну а Гослинг решил не заморачиваться (и, думается, правильно сделал).
Объявление беззнакового int в Java
Есть ли способ объявить беззнаковое int в Java?
Или вопрос может быть сформулирован так: что такое эквивалент unsigned в Java?
11 ответов
В Java нет типа данных для целых чисел без знака.
Вы также можете использовать целое число со знаком, как если бы оно было беззнаковым. Преимущество представления дополнения до двух заключается в том, что большинство операций (таких как сложение, вычитание, умножение, и сдвиг влево) идентичны на двоичном уровне для целых чисел со знаком и без знака. Однако некоторые операции (деление, сдвиг вправо, сравнение и приведение) отличаются. Начиная с Java SE 8, новые методы в Integer позволяет полностью использовать тип данных int для выполнения беззнаковой арифметики:
Вы можете использовать функцию Math.abs (number). Возвращает положительное число.
Только что создал этот фрагмент кода, который преобразует this.altura из отрицательного числа в положительное. Надеюсь, это поможет кому-то в нужде
Кажется, что вы можете решить проблему подписи, выполнив «логическое И» над значениями перед их использованием:
Пример (значение byte[] header[0] равно 0x86 ):
Может это ты имел ввиду?
RFC 868 Пример
Что произойдет, если вам нужно записать целое число без знака в IO? Практический пример: вы хотите вывести время в соответствии с RFC 868. Для этого требуется 32-битное целое число без знака с прямым порядком байтов, которое кодирует количество секунд, прошедших с 12:00 A.M. 1 января 1900 года. Как бы вы это закодировали?
Создайте собственное 32-битное целое число без знака следующим образом:
Объявить байтовый массив из 4 байтов (32 бита)
Наш my32BitUnsignedInteger теперь эквивалентен беззнаковому 32-битному целому числу с прямым порядком байтов, которое соответствует стандарту RCF 868. Да, длинный тип данных подписан, но мы проигнорировали этот факт, потому что мы предположили, что secondsSince1900 использует только младшие 32 бита). Из-за преобразования long в байт все биты выше 2 ^ 7 (первые две цифры в шестнадцатеричном формате) будут проигнорированы.
Ссылка на источник: Сетевое программирование Java, 4-е издание.
Используйте char для 16-битных целых чисел без знака.
unsigned short в java
Как я могу объявить unsigned short значение в Java?
14 ответов
Если вам действительно нужно значение с ровно 16 битами:
решение 2 (где Решение 1 не применяется): используйте нижние 16 бит int и удалите более высокие биты с & 0xffff, где необходимый.
Это действительно устаревшая нить, но для тех, кто придет после. Char является числовым типом. Он поддерживает все математические операторы, битовые операции и т. д. Это беззнаковый 16.
вы можете использовать char, так как это беззнаковое 16-битное значение (хотя технически это символ unicode, поэтому в будущем может измениться на 24-битное значение). другой альтернативой является использование int и убедитесь, что он находится в пределах диапазона.
нет такого типа в java
Да нет такой вещи, если вы хотите использовать значение в коде против битовых операций.
нет, на самом деле такого метода нет, java-язык высокого уровня. Вот почему в Java нет беззнаковых типов данных.
Он сказал, что хочет создать многомерный короткое время. Но никто не предложил побитовые операторы? Из того, что я читал, вы хотите использовать 16-битные целые числа над 32-битными целыми числами для сохранения памяти?
так, во-первых, для начала 10 000 х 10 000 коротких значений 1,600,000,000 бит, 200 000 000 байт, 200 000 килобайт, мегабайт 200.
Если вам нужно что-то с 200 МБ потребления памяти, вы можете изменить эту идею. Я также не верю, что даже скомпилирую let один беги. Вы никогда не должны инициализировать большие массивы, если что-то использует 2 функции, называемые загрузкой по требованию и кэшированием данных. По сути, загрузка по требованию относится к идее загружать только данные по мере необходимости. Затем кэширование данных делает то же самое, но использует пользовательский фрейм для удаления старой памяти и добавления новой информации по мере необходимости. Это сложно, чтобы иметь хорошую производительность скорости. Есть и другие вещи, которые вы можете сделать, но эти два мои любимые, когда закончите право.
Хорошо, вернемся к тому, что я говорил о побитовых операторах.
Итак, 32-битное целое число или в Java «int». Вы можете хранить так называемые «биты», поэтому предположим, что у Вас было 32 булевых значения, которые в Java все значения занимают 32 бита (кроме длинных) или для массивов они занимают 8 для байта, 16 для короткого и 32 для int. Поэтому, если у вас нет массивов, вы не получаете никаких преимуществ памяти от использования байта или короткого. Это не означает, что вы не должны использовать его как способ обеспечения вы и другие знаете диапазон данных, который должно иметь это значение.
теперь, как я говорил, Вы можете эффективно хранить 32 логических значения в одно целое число, выполнив следующее:
Итак, теперь короткий состоит из 16 бит, поэтому 16 + 16 = 32, который идеально вписывается в 32-битное целое число. Таким образом, каждое значение int может состоять из 2 коротких значений.
допустим, мы хотим получить два 16-битных целочисленных значений.
также в основном думают о побитовых операторах как о степенях 2. Это все, чем они являются на самом деле. Никогда не смотрите на это с точки зрения 0 и 1. Я в основном разместил это, чтобы помочь всем, кто может столкнуться с этим поиском неподписанных коротких или даже, возможно, многомерных массивов. Если есть какие-либо опечатки, я прошу прощения, быстро написал это.
Если использование сторонней библиотеки является опцией, есть jOOU (библиотека спина от jOOQ), который предлагает типы оболочки для целых чисел без знака в Java. Это не совсем то же самое, что поддержка примитивного типа (и, следовательно, байтового кода) для неподписанных типов, но, возможно, это все еще достаточно хорошо для вашего варианта использования.
(отказ от ответственности: я работаю в компании за этими библиотеками)
Какое максимальное значение для int32?
Это была последняя тема между моей командой и я. Мы снимаем для покрытия 80% кода. Моя команда утверждает, что геттеры и сеттеры автоматически реализованы, и компилятор генерирует базовый код за кулисами. В этом случае, если генерируемый код не является навязчивым, на самом деле не имеет смысла тестировать код, создаваемый компилятором для вас. Мы также обсудили асинхронные методы, и в этом случае компилятор генерирует целую кучу кода за кулисами. Это другой случай и то, что мы тестируем. Длинный ответ короткий, поднимите его с вашей командой и решите для себя, если его стоит проверить.
Кроме того, если вы используете отчет о покрытии кода, подобный нам, вы можете добавить атрибут [ExcludeFromCodeCoverage]. Наше решение состояло в том, чтобы использовать это для моделей, которые имеют только свойства с использованием геттеров и сеттеров или самим свойством. Таким образом, это не повлияет на общий охват кода% при запуске отчета о покрытии кода, предполагая, что это то, что вы используете для расчета процентного охвата кода. Счастливое тестирование!
27 ответов
Это 2,147,483,647. Самый легкий способ запомнить его через татуировку.
В Objective-C (iOS и OSX) просто запомните эти макросы:
Запомните: 21 IQ ITEM 47
Его можно декодировать с любой телефонной панели, или вы можете просто записать его на бумаге.
Чтобы вспомнить «21 IQ ITEM 47», я бы сказал: «Hitman: Codename 47 имел 21 миссию, каждая из которых была IQ ITEM».
Или «Я чищу зубы каждый день в 21:47, потому что у меня высокий IQ и я не люблю предметы во рту».
(Groovy чрезвычайно полезен для справочника в контексте Java.)
Чтобы никогда не забывать максимальное значение любого типа:
Если оно имеет 32 бита, наибольшим возможным значением будут 32 бита с номером 1:
Результат будет 4294967295 в десятичном виде:
Но, как есть также представление отрицательных чисел, разделите 4294967295 на 2 и получите 2147483647.
Беззнаковый короткий в Java
Как я могу объявить значение unsigned short в Java?
16 ответов
Если вам действительно нужно значение ровно с 16 битами:
Решение 2 (где решение 1 не применяется): используйте младшие 16 бит int и удалите старшие биты с помощью & 0xffff, где это необходимо.
Мы обрабатываем сигналы, записанные специальным встроенным оборудованием, поэтому мы обрабатываем множество беззнаковых 16 из A-D. Мы много лет использовали символы повсюду, и у нас никогда не было проблем.
В Java такого типа нет
Да нет такого, если вы хотите использовать значение в кодовых и битовых операциях.
Он сказал, что хочет создать многомерный короткий массив. Еще никто не предлагал побитовые операторы? Из того, что я читал, вы хотите использовать 16-битные целые числа вместо 32-битных целых чисел для экономии памяти?
Если вам нужно что-то с потребляемой памятью 200 МБ, вы можете переделать эту идею. Я также не верю, что даже скомпилировать, не говоря уже о запуске. Вы никогда не должны инициализировать такие большие массивы, если что-то использует 2 функции, называемые загрузкой по запросу и кэшированием данных. По сути, загрузка по запросу относится к идее загружать данные только по мере необходимости. Затем кэширование данных делает то же самое, но использует настраиваемый фрейм для удаления старой памяти и добавления новой информации по мере необходимости. У этого непросто получить ХОРОШИЕ скоростные характеристики. Есть и другие вещи, которые вы можете делать, но эти два являются моими любимыми, когда все сделано правильно.
Вернемся к тому, что я говорил о побитовых операторах.
Как я уже говорил, вы можете эффективно сохранить 32 логических значения в одно целое число, выполнив следующие действия:
Итак, теперь короткий состоит из 16 бит, поэтому 16 + 16 = 32, что ИДЕАЛЬНО подходит для 32-битного целого числа. Таким образом, каждое значение int может состоять из двух коротких значений.
Итак, нам нужно затем активировать биты 17–32. Итак, мы должны начать с чего-то большего, чем 15 бит. Итак, мы начинаем с 16 бит. Итак, взяв значение2 и умножив его на 65536, это то, что делает « 0
Если можно использовать стороннюю библиотеку, существует jOOU (дополнительная библиотека от jOOQ), который предлагает типы оболочки для целых чисел без знака в Java. Это не совсем то же самое, что поддержка примитивного типа (и, следовательно, байтового кода) для беззнаковых типов, но, возможно, этого достаточно для вашего варианта использования.
(Отказ от ответственности: я работаю в компании, стоящей за этими библиотеками)
Подобные методы существуют для Integer и Long:
В Java нет беззнаковых типов. Для чего тебе это?
Однако в Java есть «байтовый» тип данных.
Как и некоторые другие респонденты, мне интересно, почему у вас острая потребность в беззнаковых коротких строках, которые не могут быть заполнены никаким другим типом данных.
Простая программа, показывающая, зачем нужны беззнаковые числа:
Теперь для тех, кто не относится к системным типам:



