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.
Автор статьи:
Обновлено:
Добавить комментарий