Двойная тильда (~~) в Java: назначение и особенности использования
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
В Java двойная тильда ~~
не представляет собой отдельную синтаксическую конструкцию. Она служит особой уловкой при выполнении битовых операций, позволяя привести число с плавающей запятой к целочисленному типу. Первая тильда ~
реализует инверсию бит числа, вторая же возвращает все на исходные позиции. В результате исключается дробная часть, тогда как целая сохраняется в неизменном виде.
Пример:
double value = 8.9;
int intValue = ~~value; // значение intValue будет равно 8
Примечание: Подобная уловка эффективна для чисел, которые не превышают диапазон целых чисел, и применима только для положительных значений.
Разбираемся в практике округления и преобразования типов
Изучаем нюансы побитового округления
В Java конструкция ~~
не имеет особого значения, в отличие от JavaScript, где ее роль крайне важна. Разделив тильду на отдельные элементы, мы получим оператор побитового ОТРИЦАНИЯ, двойное применение которого компенсирует взаимное действие. Однако использование ~~
для чисел, выходящих за пределы 32-битного целочисленного диапазона, может вызвать неожиданные результаты из-за переполнения.
Рассматриваем особенности преобразования типов
В контексте Google Web Toolkit (GWT), осуществляющего преобразование Java-кода в JavaScript, применение ~~
обеспечивает корректное и предсказуемое приведение и округление чисел с плавающей точкой к целочисленным.
Рассматриваем специальные случаи и их влияние
В Java использование ~~
может показаться избыточным, однако есть интересный случай с Integer.MAX_VALUE
. В JavaScript ~~
при преобразовании значения 2^31 – 1
(Integer.MAX_VALUE
) возвращает -1, являющийся проявлением цикличности 32-битных целых чисел. Этот аспект важен при работе с GWT и Java-кодом, который транслируется в JavaScript.
Визуализация
Возьмем в качестве примера стопку ваших любимых книг 📚📈.
Если сравнить ее с числом с плавающей запятой, стопка будет содержать массу деталей (дробные части).
Применение ~~
можно представить как быстрое двукратное воздействие ножницами ✂️📔:
Первый раз мы обрезаем избыточное (неполные страницы), приводя высоту стопки к целому значению. Второй раз мы избавляемся от остатков бумаги (дробные части).
В результате получается аккуратная стопка из целых книг 📚.
Вот как работает ~~
: устраняет лишнее и сохраняет целостность целого числа.
Влияние на GWT и совместимость между языками
Открытие кросс-компиляции с GWT
Google Web Toolkit (GWT) преобразует Java в JavaScript, при этом активно используя ~~
. Это необходимо для обеспечения единообразия при обработке чисел в обоих языках. Специфика работы GWT заключается в учете различий между строгой системой типизации Java и более гибкой обработкой 32-битных знаковых целых чисел в JavaScript в рамках битовых операций.
Разгадываем тайны JavaScript-кодирования
В JavaScript побитовые операторы преобразуют числовой операнд в 32-битное целое число. Это оказывается полезным для обеспечения согласованности поведения хеш-функций и других вычислений после округления.
Признаем роль ~~
в Java
В чистом Java-коде использование ~~
редко, и обычно его можно встретить в устаревших системах или при обеспечении взаимодействия между Java и JavaScript в приложениях, где критичен вопрос производительности.