Изменения

Перейти к: навигация, поиск

Побитовые операции

1347 байт добавлено, 14:49, 8 марта 2016
Применение
====Проверка на то, является ли число степенью двойки====
Пусть дано число <tex>x</tex>. Тогда, если результатом выражения <tex>(x\ \&\&\ !(x\ \&\ (x - 1)))</tex> является единица, то число <tex>x</tex> {{---}} степень двойки.
Правая часть выражения <tex>(!(x\ \&\ (x - 1)))</tex> будет равна единице только если число <tex>x</tex> равно <tex>0</tex> или является степенью двойки. Если число <tex>x</tex> является степенью двойки, то в двоичной системе счисления оно представляется следующим образом: <tex>1\underbrace{0\dots0}_{n}</tex>, где <tex>n</tex> {{---}} показатель степени. Соответственно, выражение <tex>(x - 1)</tex> будет иметь вид <tex>\underbrace{1\dots1}_{n}</tex>, и выражение <tex>x\ \&\ (x - 1)</tex> равно <tex>0</tex>.
 
Операция логического И в данном выражении отсекает тот случай, когда <tex>(x = 0)</tex> и не является степенью двойки, но при этом правая часть выражения <tex>(!(x\ \&\ (x - 1)))</tex> равна единице.
====Определение знака числа====
Пусть дано число <tex>x</tex>. Поскольку при сдвиге вправо на освобождающиеся позиции устанавливается бит знака, знак числа <tex>x</tex> можно определить следующим образом, выполнив сдвиг вправо на всю длину переменной:
<code>
<font color = green>// в этом и следующих примерах в константе '''CHAR_BIT''' хранится количество битов в одном байте</font>
sign = x >> ( ''sizeof'if'('''intx != 0 mask = 1 ''') * else'''CHAR_BIT''' - 1) <font color mask = green>// если x < 0, результатом будет -1, иначе 0 </font> sign = (x != 0) mask | (x >> (''sizeof''('''int''') * '''CHAR_BIT''' - 1)) <font color = green>// результатом будет -1, 0, или +1 // для отрицательного, равного нулю и положительного числа x соответственно</font></code>Используя побитовые операции можно также узнать, различны ли знаки двух переменных:<code> '''bool''' result = ((x <tex>\oplus</tex> y) < 0) <font color = green>// значение переменной result == ''true'', если знаки переменных x и y различны</font>
</code>
Используя побитовые операции можно также узнать, различны ли знаки двух переменных <tex>x</tex> и <tex>y</tex>. Если числа имеют различный знак, то результат операции XOR, произведенной над их знаковыми битами, будет единицей. Поэтому неравенство <tex>((x \oplus y) < 0</tex> будет верно в том случае, если числа <tex>x</tex> и <tex>y</tex> разного знака.
====Вычисление модуля числа без использования условного оператора====
Пусть дано число <tex>x</tex>. Тогда
<code>
mask = x >> ''sizeof''('''int''') * '''CHAR_BIT''' - 1
276
правок

Навигация