Разница между количеством = количество + n & 1 и количеством + = n & 1 - PullRequest
0 голосов
/ 21 января 2020

Я пишу программу, в которой я хочу вычислить установленные биты в целом числе. Например, если 5 можно записать как 0101, где число установленных битов равно 2. Однако, когда я выполнил программу, где я написал count = count + n & 1 Это не сработало, но если я измените это на count + = n & 1 , оно работало совершенно нормально, и я не мог найти причину для этого

#include<bits/stdc++.h>
using namespace std;

int main(){
    unsigned int n = 5;
    unsigned int count = 0;
    while(n){

      //count += n&1;
        count = count + n & 1;
        n>>=1;
    }
    cout<<count;
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Приоритетность в C ++ или любых других языках программирования определяет порядок вычисления этих инструкций, некоторые go справа налево, некоторые оцениваются первыми перед другими. Таким образом, в этом случае ваш + = был оценен после оператора & (AND), и это стало причиной вашего неправильного ответа, когда это делается таким образом

count = count + n & 1;

Поскольку в приведенном выше коде + Затем оценивается И затем. Вы можете либо поставить вокруг него скобку, как показано ниже

count = count + (n & 1);

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

Ассоциативность оператора - это свойство, которое определяет, как операторы с одинаковым приоритетом группируются при отсутствии скобок. Это влияет на то, как вычисляется выражение.

И вы всегда можете проверить справочные руководства на C ++ или C, чтобы узнать больше о приоритете. https://en.cppreference.com/w/cpp/language/operator_precedence

0 голосов
/ 21 января 2020

enter image description here

Операторы оцениваются сверху вниз по списку. Те, что вверху, оцениваются первыми, а те, что ниже, оцениваются последними в соответствии с их ассоциативностью слева направо или справа налево.

...