Слова AND и OR (введенные в гл. 4) используют «двоичную логику», т. е. каждый бит проверяется независимо, и перенос единицы в старший разряд не производится. Выполним, например, операцию AND над следующими двумя двоичными числами: 0000000011111111 0110010110100010 AND ---------------- 0000000010100010
Для того чтобы результирующий бит был равен единице, соответствующие биты-аргументы должны быть оба равными единице. Заметьте, что в этом примере первый аргумент содержит все нули в старшем байте и все единицы в младшем. Действие второго операнда здесь заключается в том, что младшие восемь битов сохраняются неизменными, а старшие восемь битов сбрасываются в нуль. Первый операнд служит «маской» для маскирования старшего байта второго операнда.
Слово OR также применяет двоичную логику. В примере1000100100001001 0000001111001000 OR ---------------- 1000101111001001
единицу получается в тех битах, где хотя бы один операнд был равен единице. И снова каждый столбец проверяется независимо, без переноса единицы в старший разряд. При умелом использовании масок в одном 16-разрядном значении можно хранить 16 отдельных флагов. Так, мы можем узнать, чему равен соответствующий (скажем, пятый) бит: 1011101010011100 нулю или единице, путем маскирования остальных флагов: 1011101010011100
0000000000010000 AND ---------------- 0000000000010000
Так как значение нашего бита равно единице, результат будет истинным. Если бы значение бита составляло нуль, то результат
оказался бы ложным. Мы можем сбросить определенный флаг в нуль, не трогая остальные, следующим приемом: 1011101010011100 1111111111101111 AND
---------------- 1011101010001100 ^
Мы работали с маской, во всех битах которой, за исключением сбрасываемого в нуль, содержатся единицы. Можно установить тот же самый флаг, т. е. сделать его единицей, таким образом: 1011101010001100
0000000000010000 OR ---------------- 1011101010011100 ^
Ниже приводятся несколько приемов использования операции AND.