integer - это - implication boolean logic




логические операции с целыми числами (3)

Вы получаете первый результат, потому что выполняете логическое and между битовыми строками двух чисел:

2 & 1 => 010 & 001 = 000 = 0
3 & 1 => 011 & 001 = 001 = 1
4 & 1 => 100 & 001 = 000 = 0
5 & 1 => 101 & 001 = 001 = 1

Фактически вы проверяете, установлен ли бит «1», который будет действителен только для нечетных чисел.

При выполнении or операции:

0 | 1 => 000 | 001 = 001 = 1
1 | 1 => 001 | 001 = 001 = 1
2 | 1 => 010 | 001 = 011 = 3
3 | 1 => 011 | 001 = 011 = 3
4 | 1 => 100 | 001 = 101 = 5
5 | 1 => 101 | 001 = 101 = 5

Так как в этом случае эффект или or должен всегда устанавливать 1 бит, четные числа будут увеличиваться на единицу до их ближайшего большего нечетного числа.

Это, вероятно, довольно простой ... но я, похоже, не понимаю:

Как сделать

(2 & 1) = 0
(3 & 1) = 1
(4 & 1) = 0

и т.д..

Этот вышеприведенный шаблон помогает найти четные числа

или

(0 | 1) = 1
(1 | 1) = 1
(2 | 1) = 3
(3 | 1) = 4
(4 | 1) = 5
(5 | 1) = 5

Я знаю, как булева алгебра работает между битами. Но я не понимаю, как булевая алгебра работает с целыми числами (по крайней мере на C #).

заранее спасибо.


Ключ состоит в том, что центральный процессор выполняет 32 логических операции параллельно, по одному для каждой позиции битов входных целых чисел (при условии, конечно, 32 битных целых числа).


Он работает аналогично в C #, как и в двоичном формате.

2 | 1 = 3 2 | 1 = 3 и 4 | 1 = 5 4 | 1 = 5 .

Чтобы понять это, вам нужно подумать о двоичном представлении 1,2,3,4 и 5:

010 | 001 = 011 010 | 001 = 011 и 100 | 001 = 101 100 | 001 = 101 .

По аналогии:

010 & 001 = 000 и 011 & 001 = 001