Понимание побитового И оператора - PullRequest
48 голосов
/ 07 августа 2010

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

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

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

Оператор побитового И

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

w3 = w1 & 3;

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

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

word &= 15;

выполняет ту же функцию, что и следующий:

word = word & 15;

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

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

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

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

Спасибо!

Ответы [ 4 ]

147 голосов
/ 07 августа 2010

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

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 (не ИЛИ) означает получение побитового ИЛИ двухчисла, а затем все наоборот (где был 0, теперь 1, где был 1, теперь 0).

Побитовое NAND (не И) означает взять побитовое И двухчисла, а затем все наоборот (где был 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");
}

Получить?

РЕДАКТИРОВАТЬ:больше вещей

Вы также столкнетесь с оператором "bithift": << и >>.Это просто означает «сдвинуть все влево на n битов» или «сдвинуть все влево на n битов».

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

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

А:

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

2 голосов
/ 07 августа 2010

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

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

1 голос
/ 07 августа 2010

@ cHao & all: Нет! Биты не являются числами. Они не ноль или один!

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

Но немного это только вещь, представляющая простую альтернативу. Он говорит «это есть» или «это не так». Он ничего не говорит о самой вещи, о ней, о ней. Это не говорит, что это такое.

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

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

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

Привет

1 голос
/ 07 августа 2010
w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

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

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

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

...