Понимание поразрядной Операции И

Я читал о разрядных операторах в Objective C в книге Kochan, "Программируя в Objective C".

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

Вот кавычка из книги:

Поразрядная операция И

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

w3 = w1 & 3;

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

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

word &= 15;

поэтому выполняет ту же функцию как следующее:

word = word & 15;

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

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

Когда книжные ссылки, "устанавливающие все биты" теперь, все биты.. Что точно немного. Это не просто 0 или 1 в 2-й основе, другими словами, двоичном файле?

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

Спасибо!

48
задан Qcom 6 August 2010 в 09:33
поделиться

4 ответа

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

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

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

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

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

(0 И a = 0, 0 И b = 0, ... j И 1 = j, i И 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");
}

Понятно?

EDIT: еще кое-что

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

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

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

И:

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

148
ответ дан 7 November 2019 в 12:06
поделиться
w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

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

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

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

1
ответ дан 7 November 2019 в 12:06
поделиться

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

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

2
ответ дан 7 November 2019 в 12:06
поделиться

@cHao & all: Нет! Биты - это не числа. Их не ноль и не единица!

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

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

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

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

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

Приветствую

1
ответ дан 7 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: