2008-11-26 7 views
3

Это, вероятно, довольно простой ... но я, кажется, не понял:логические операции с целыми числами

Как

(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#).

благодарит заранее.

+0

Спасибо всем, кто его очистил. Не понял, что все так просто. Эта мысль перешла мне в голову, но я не делал мысленного преобразования целых чисел и работал на ней поразмерно. Спасибо! – 2008-11-26 03:56:42

ответ

4

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

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

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

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

Аналогично:

010 & 001 = 000 и 011 & 001 = 001

0

Это делает битовые операции на целое число. То, что он выполняет логический или/или каждый бит в первом целом с соответствующим битом в другом целочисленном. Затем он возвращает результат всех этих операций. Например, 4 = 0100 и 1 = 0001, логические и из них будут битовать бит и получить 0000 (начиная с 0 & 0 = 0, 1 & 0 = 0, 0 & 0 = 0 и 0 & 1 = 0). Для или вы получите 0101 (так как 0 | 0 = 0, 1 | 0 = 1, 0 | 0 = 0 и 0 | 1 = 1). Фокус в том, что это побитовые операции, а не логические операции, которые работают только с логическими значениями в C#.

1

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

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 бит, даже номера будут увеличиваться на единицу их ближайшего большего нечетного числа.

Смежные вопросы