Побитовое И и: символ - PullRequest
       8

Побитовое И и: символ

0 голосов
/ 16 февраля 2019

Я занимаюсь кодированием уже почти два месяца, и я только начинаю "свободно" владеть основами языка.Недавно я наткнулся на фрагмент кода, который выглядел так:

if (! (n & 1)) {
    median += a[n / 2 - 1];
    median /= 2;
}

map<int, int> f;

for (int e : a) {
    f[e]++;
}

int mode = 0;

for (auto e : f) {
    if (e.second > f[mode]) {
        mode = e.first;
    }
}

Я понимаю, что первый if использует оператор Bitwise, но я не могу понять, как он там используется.Я прочитал несколько учебных пособий, но они не имеют особого смысла для меня.

Второй вопрос, который у меня есть, касается двух циклов.Они используют символ: и имеют только один параметр?Разве не должно быть три?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

если n четное, преобразование его в двоичное приведет к чему-то вроде 1010, причем младший значащий бит всегда равен 0. Если вы & 0 и 1, вы получите 0. Первый цикл if должен проверить, является ли n четным,

Для побитовых операций - 1. Преобразовать число в двоичное.2. Выполните операцию на отдельном бите.например, 3 & 6 = 011 и 110 = 010 = 2

0 голосов
/ 16 февраля 2019

! (N & 1)

Расположите их как битовые поля, например:

       101010101
     & 000000001
       ---------
result 000000001

Значение, отличное от нуля, будет иметь логическое значение true или false context будет повышен до true.Только результат 0 будет повышен до false.! ( not ) меняет результат так, что true становится false и наоборот.

Второй вопрос касается на основе диапазонадля цикла :

for (auto e : f) {

Это (начиная с C ++ 11) упрощенная версия:

for(auto it=std::begin(f); it!=std::end(f); ++it) {
    auto e = *it;
0 голосов
/ 16 февраля 2019

Для побитового И проверяется, является ли n четным.Он работает следующим образом: если последний бит в n равен 1 (что для каждого нечетного числа), то результат n & 1 будет равен 1, в противном случае он будет равен 0. Так как все! = 0 оценивается как истинноев с ++ это инвертирует эту проверку.Поскольку все выражение переворачивается на "!"он будет равен false, если n нечетно, и true, если n четно.

В качестве примера возьмем n = 3, n = 4, n = 5 и представим их в двоичном виде:

n=3:
0101 & 0001 = 0001

n=4:
1000 & 0001 = 0000

n=5:
1001 & 0001 = 0001

https://docs.microsoft.com/en-us/cpp/cpp/bitwise-and-operator-amp?view=vs-2017

Для работы в диапазоне

for (int e : a)

это

https://en.cppreference.com/w/cpp/language/range-for

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...