Полезные трюки в программировании на языке D

Полезные трюки в программировании на языке D

1. Проверка числа на четность / нечетность

Для проверки числа на четность или нечетность можно использовать побитовую операцию & (побитовое И). Если младший бит числа равен 0, то число четное, если 1 — нечетное.

int number = 5;
bool isEven = (number & 1) == 0;
bool isOdd = (number & 1) == 1;

writeln("Число ", number, " четное: ", isEven); // false
writeln("Число ", number, " нечетное: ", isOdd); // true

2. Приведение любого типа к bool

В языке D, как и в C, двойное отрицание !! используется для приведения любого типа к логическому значению bool.

int number = 10;
bool isNonZero = !!number;

writeln("Число ", number, " не равно нулю: ", isNonZero); // true

3. Проверка, является ли число степенью двойки

Чтобы проверить, является ли число степенью двойки, можно использовать выражение (n - 1) & n. Если результат равен нулю, то число является степенью двойки.

int number = 16;
bool isPowerOfTwo = (number & (number - 1)) == 0;

writeln("Число ", number, " является степенью двойки: ", isPowerOfTwo); // true

4. Скоростное умножение/деление на 2

Для умножения числа на 2 используется операция сдвига влево <<, а для деления на 2 — операция сдвига вправо >>.

int number = 4;
int multipliedByTwo = number << 1;
int dividedByTwo = number >> 1;

writeln("Число ", number, " умноженное на 2: ", multipliedByTwo); // 8
writeln("Число ", number, " деленное на 2: ", dividedByTwo); // 2

5. Использование битовых масок

Чтобы извлечь значение конкретного бита числа, используется побитовое И (&).

int number = 29; // 11101 в двоичном виде
int mask = 1 << 3; // маска для 4-го бита (1000)
int bitValue = (number & mask) >> 3;

writeln("Значение 4-го бита в числе ", number, ": ", bitValue); // 1

6. Установка битов в числе

Использование побитового «ИЛИ» (|) для установки битов в 1

int number = 147; // 10010011 в двоичном виде
int mask = 1 << 4; // маска для 5-го бита (10000)
int newNumber = number | mask;

writeln("Число после установки 5-го бита: ", newNumber); // 163 (10100011)

Принцип работы с таблицей истинности

Операция побитового ИЛИ (|) устанавливает соответствующий бит в 1, если хотя бы один из битов операндов равен 1.

7. Побитовое отрицание

Побитовое отрицание (~) инвертирует все биты числа.

int number = 5; // 00000101 в двоичном виде
int invertedNumber = ~number;

writeln("Инвертированное число: ", invertedNumber); // -6 (в зависимости от системы представления чисел)

8. Использование шестнадцатеричных битовых масок

Шестнадцатеричные маски часто используются для удобства и сокращения записи.

int number = 0b10101010; // 170 в десятичной системе
int mask = 0xF0; // 11110000 в двоичной системе
int result = number & mask;

writeln("Результат применения маски: ", result); // 160 (0xA0)

9. Применение исключающего ИЛИ (XOR)

Обмен значениями между двумя переменными

int a = 5;
int b = 9;

a = a ^ b;
b = a ^ b;
a = a ^ b;

writeln("a: ", a, ", b: ", b); // a: 9, b: 5

Простое шифрование данных

char data = 'A';
char key = 'K';
char encrypted = data ^ key;
char decrypted = encrypted ^ key;

writeln("Зашифрованное значение: ", encrypted); // зависит от ключа
writeln("Расшифрованное значение: ", decrypted); // 'A'

10. Определение размера массива в старом стиле

Определение размера массива с использованием sizeof и length.

int[] array = [1, 2, 3, 4, 5];
size_t size = array.length;

writeln("Размер массива: ", size); // 5

11. Быстрый обратный квадратный корень

Алгоритм быстрого обратного квадратного корня.

float Q_rsqrt(float number) {
    int i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    i = *cast(int*)&y;            // evil floating point bit level hacking
    i = 0x5f3759df - (i >> 1);    // what the fuck?
    y = *cast(float*)&i;
    y = y * (threehalfs - (x2 * y * y)); // 1st iteration
    // y = y * (threehalfs - (x2 * y * y)); // 2nd iteration, this can be removed

    return y;
}

float number = 4.0;
float result = Q_rsqrt(number);

writeln("Быстрый обратный квадратный корень: ", result); // примерно 0.5

12. Проверка отрицательности числа

Проверка отрицательности числа с использованием форматирования строк.

int number = -10;
bool isNegative = number.to!string[0] == '-';

writeln("Число ", number, " отрицательное: ", isNegative); // true

Этот метод не рекомендуется для использования в реальном коде, так как он неэффективен и ненадежен. Предпочтительно использовать простое сравнение:

bool isNegative = number < 0;
writeln("Число ", number, " отрицательное: ", isNegative); // true

Эти трюки и методы могут значительно упростить и ускорить выполнение различных операций в ваших программах на языке D.


Карпов Ярослав

Автор статьи:

Обновлено:

23.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *