показывает 32-й бит 1 как установлено - PullRequest
0 голосов
/ 12 июня 2019

когда я подсчитывал количество установленных битов в числе, я дал ввод как 1 и обнаружил, что ANS равен 2, когда при отладке программы был установлен 32-битный код, как это возможно?Потому что только 1 бит установлен в 1

#include <stdio.h>
#include <iostream>
using namespace std;


int main() {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int ans = 0;
        for(int i=32;i>=0;i--){
            if(n&(1<<i))
               ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Проблема в первой итерации.Вы сдвигаете число 1 на 32 бита, что на моем компьютере приводит к 1. Так как int, вероятно, 32-разрядный, это не определенное поведение.

if(n&(1<<32)!=0)

Исправление заключается в том, чтобы начать с 31.

for(int i=31;i>=0;i--)
0 голосов
/ 12 июня 2019

32 до 0 оба включительно - всего 33 бита, вы здесь на единицу:

for(int i=32;i>=0;i--){
     if(n&(1<<i)) ans++;
     std::cout << i << "\n";
}

Я добавил cout, который позволяет вам это проверить. Вместо этого вы должны начать цикл с 31, то есть

for(int i=31;i>=0;i--){

Обратите внимание, что std::bitset очень удобно, когда вы заботитесь о битовом представлении чисел.

PS: На самом деле, я удивляюсь, почему вы изменили цикл. Проблемы такого рода менее вероятны, когда вы пишете более распространенные for (int i=0;i<32;++i)

...