ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Двойная тильда (~~) в Java: назначение и особенности использования

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В Java двойная тильда ~~ не представляет собой отдельную синтаксическую конструкцию. Она служит особой уловкой при выполнении битовых операций, позволяя привести число с плавающей запятой к целочисленному типу. Первая тильда ~ реализует инверсию бит числа, вторая же возвращает все на исходные позиции. В результате исключается дробная часть, тогда как целая сохраняется в неизменном виде.

Пример:

Java
Скопировать код
double value = 8.9;
int intValue = ~~value; // значение intValue будет равно 8

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

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Разбираемся в практике округления и преобразования типов

Изучаем нюансы побитового округления

В 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 в приложениях, где критичен вопрос производительности.

Полезные материалы