Книга: Программирование на языке Ruby
5.17. Поразрядные операции над числами
5.17. Поразрядные операции над числами
Иногда требуется работать с двоичным представлением объекта Fixnum
. На прикладном уровне такая необходимость возникает нечасто, но все-таки возникает.
Ruby обладает всеми средствами для таких операций. Для удобства числовые константы можно записывать в двоичном, восьмеричном или шестнадцатеричном виде. Поразрядным операциям И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ соответствуют операторы &
, |
, ^
и ~
.
x = 0377 # Восьмеричное (десятичное 255)
y = 0b00100110 # Двоичное (десятичное 38)
z = 0xBEEF # Шестнадцатеричное (десятичное 48879)
а = x | z # 48895 (поразрядное ИЛИ)
b = x & z # 239 (поразрядное И)
с = x ^ z # 48656 (поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ)
d = ~ y # -39 (отрицание или дополнение до 1)
Метод экземпляра size
позволяет узнать размер слова для той машины, на которой исполняется программа.
size # Для конкретной машины возвращает 4.
Имеются операторы сдвига влево и вправо (<<
и >>
соответственно). Это логические операторы сдвига, они не затрагивают знаковый бит (хотя оператор >>
распространяет его).
x = 8
y = -8
а = x >> 2 # 2
b = y >> 2 # -2
с = x << 2 # 32
d = y << 2 # -32
Конечно, если сдвиг настолько велик, что дает нулевое значение, то знаковый бит теряется, поскольку -0 и 0 — одно и то же.
Квадратные скобки позволяют трактовать числа как битовые массивы. Бит с номером 0 всегда является младшим, вне зависимости от порядка битов в конкретной машинной архитектуре.
x = 5 # То же, что 0b0101
а = x[0] # 1
b = x[1] # 0
с = x[2] # 1
d = x[3] # 0
# И так далее # 0
Присваивать новые значения отдельным битам с помощью такой нотации невозможно (поскольку Fixnum
хранится как непосредственное значение, а не как ссылка на объект). Но можно имитировать это действие путем сдвига 1 влево на нужное число позиций с последующим выполнением операции ИЛИ или И.
# Выполнить присваивание x[3] = 1 нельзя,
# но можно поступить так:
x |= (1<<3)
# Выполнить присваивание x[4] = 0 нельзя,
# но можно поступить так:
x &= ~(1<<4)
- 5.1. Представление чисел в языке Ruby
- 5.2. Основные операции над числами
- 5.3. Округление чисел с плавающей точкой
- 5.4. Сравнение чисел с плавающей точкой
- 5.5. Форматирование чисел для вывода
- 5.6. Вставка разделителей при форматировании чисел
- 5.7. Работа с очень большими числами
- 5.8. Использование класса BigDecimal
- 5.9. Работа с рациональными числами
- 5.10. Перемножение матриц
- 5.11. Комплексные числа
- 5.12. Библиотека mathn
- 5.13. Разложение на простые множители, вычисление НОД и НОК
- 5.14. Простые числа
- 5.15. Явные и неявные преобразования чисел
- 5.16. Приведение числовых значений
- 5.17. Поразрядные операции над числами
- 5.18. Преобразование системы счисления
- 5.19. Извлечение кубических корней, корней четвертой степени и т.д.
- 5.20. Определение порядка байтов
- 5.21. Численное вычисление определенного интеграла
- 5.22. Тригонометрия в градусах, радианах и градах
- 5.23. Неэлементарная тригонометрия
- 5.24. Вычисление логарифмов по произвольному основанию
- 5.25. Вычисление среднего, медианы и моды набора данных
- 5.26. Дисперсия и стандартное отклонение
- 5.27. Вычисление коэффициента корреляции
- 5.28. Генерирование случайных чисел
- 5.29. Кэширование функций с помощью метода memoize
- 5.30. Заключение
- Поразрядные операции
- Восстановление "безнадежных" баз данных. InterBase Surgeon
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Надежность и безопасность
- 2.5. Разработка технического задания на проведение детального анализа рынка при работе над инновационным проектом. Основ...
- Операции с множествами узлов
- 4. Null-значения и логические операции
- 1. Операции объединения, пересечения, разности
- 2. Операции декартового произведения и естественного соединения
- 5. Производные операции
- 2. Унарные операции на языке структурированных запросов
- 3. Бинарные операции на языке структурированных запросов