Понимание побитового оператора AND

Я читал о битовых операторах в Objective-C в книге Кочана "Программирование в Objective-C".

Я ОЧЕНЬ путаюсь в этой части, хотя я действительно понял все остальное, представленное мне до сих пор.

Вот цитата из книги:

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

Побитовое ANDing часто используется для операций маскировки. То есть, этот оператор можно легко использовать для установки определенных битов элемента данных на 0. Например, оператор

w3 = w1 & 3;

присваивает w3 значение w1 побитовое ANDed с константой 3. Это имеет то же значение, что и все биты в w, отличные от самых правых двух битов, до 0 и сохраняющие самые правые два бита из w1.

Как и все бинарные арифметические операторы в C, бинарные операторы бит также могут использоваться в качестве операторов присваивания путем добавления знака равенства. Утверждение

word &= 15;

поэтому выполняет ту же функцию, что и:

word = word & 15;

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

ОК, так вот что я пытаюсь понять. Теперь, я очень сильно смущен этой концепцией, и я просто ищу немного разъяснения, если кто-то хочет помочь мне в этом.

Когда в книге упоминается "установка всех битов" сейчас, все биты. Что именно немного. Разве это не только 0 или 1 на 2-й базе, другими словами, двоичный?

Если да, то почему в первом примере все биты, кроме "rightmost 2", равны 0? Это 2, потому что 3 - 1, взяв 3 из нашей постоянной?

Спасибо!

Ответ 1

Числа могут быть выражены в двоичном виде следующим образом:

3    = 000011
5    = 000101
10   = 001010

... и т.д.. Я предполагаю, что вы знакомы с бинарными.

Побитовое И означает взять два числа, выровнять их друг над другом и создать новое число с 1, где оба числа имеют 1 (все остальное равно 0).

Например:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

Побитовое ИЛИ означает взять два числа, выровнять их друг над другом и создать новый номер, который имеет 1, где либо номер имеет 1 (все остальное равно 0).

Например:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

Побитовое XOR (исключающее ИЛИ) означает взять два числа, выровнять их друг над другом и создать новый номер, в котором есть 1, где либо номер имеет 1 И другой номер имеет 0 (все остальное - 0).

Например:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

Побитовое NOR (Not OR) означает взять побитовое ИЛИ двух чисел, а затем отменить все (где было 0, там теперь 1, где было 1, теперь 0).

Побитовое NAND (Not AND) означает "Побитовое И двух чисел", а затем отменить все (где было 0, там теперь 1, где было 1, теперь 0).

Продолжение: почему word &= 15 устанавливает все, кроме 4 самых правых бита, в 0? Теперь вы сможете понять это...

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

(0 AND a = 0, 0 AND b = 0,... j AND 1 = j, i AND 1 = i,...)

Как это полезно? На многих языках мы используем вещи, называемые "битмаски". Битовая маска по существу представляет собой число, которое представляет собой совокупность меньших чисел, объединенных вместе. Мы можем комбинировать числа вместе, используя OR, и раздвигать их, используя AND. Например:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

Если у меня есть только карта и шляпа, я могу выразить это как myInventoryBitmask = (MagicMap | MagicHat), а результат - моя битовая маска. Если у меня ничего нет, тогда моя битовая маска равна 0. Если я хочу посмотреть, есть ли у меня палочка, тогда я могу сделать:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}

Получите его?

ИЗМЕНИТЬ: больше вещей

Вы также столкнетесь с оператором "битдвига": < < и → . Это просто означает "сдвинуть все оставшиеся n бит" или "сдвинуть все правильные n бит".

Другими словами:

1 << 3= 0001 << 3= 0001000= 8

и

8 >> 2= 01000 >> 2= 010= 2

Ответ 2

"Бит" сокращен для "двоичной цифры". И да, это 0 или 1. В байте почти всегда 8, и они написаны как десятичные числа - с самой значительной цифрой слева и наименее значимыми справа.

В вашем примере w1 & 3 маскирует все, кроме двух наименее значимых (самых правых) цифр, потому что 3, в двоичном формате - 00000011. (2 + 1) Операция AND возвращает 0, если любой бит равен ANDed равен 0, поэтому все но последние два бита автоматически 0.

Ответ 3

w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

0 и любой бит N = 0

1 и любой бит N = N

Итак, все побитовое с 3 имеет все свои биты, кроме двух последних, равных 0. Последние два бита, а и b в этом случае, сохраняются.

Ответ 4

@cHao и все: Нет! Биты - это не цифры. Они не равны нулю или одному!

Ну, 0 и 1 возможны и допустимые интерпретации. Нуль и один - типичная интерпретация.

Но это всего лишь вещь, представляющая простую альтернативу. В нем говорится "это" или "это не так". Он ничего не говорит о вещах, "это", сам. Он не говорит, что это за вещь.

В большинстве случаев это не беспокоит вас. Вы можете взять их за номера (или части, цифры, числа), как вы (или комбинацию языков программирования, процессора и другого оборудования, вы знаете как "типичный" ), что делает usaly - и, возможно, у вас никогда не будет проблем с ними.

Но нет основной проблемы, если вы переключите значение "0" и "1". Хорошо, если вы делаете это при программировании ассемблера, вы найдете это немного проблематичным, так как некоторые мнемоники будут делать другую логику, тогда они расскажут вам свои имена, цифры будут сведены на нет и такие вещи.

Посмотрите http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm, если хотите.

Привет