Ошибка в коде , не все значения подходят (с++)

Код пишет ошибку. Весь день ее ищу. Не все числа проходят правильно его решения. //a = 0 ≤ a < 2^32 //k = 0 ≤ k < 32)

#include <iostream>
int main() {
    long long a;
    int k;
    std::cin >> a >> k;
    unsigned int c;
    std::cin >> c;
    switch (c) {
    case 1:
        for (std::size_t i = 0; i < k; ++i) a &= ~(1 << i); //надо обнулить все биты 
числа а до k-ого не включительно 
    std::cout << a;
        break;
    case 2:
        a ^= (1 << k);  std::cout << a; // надо инвертировать k-ый бит числа a 
        break;
    case 3:
        for (std::size_t i = k; i < 32; ++i) a &= ~(1 << i); // надо обнулить все биты 
числа а начиная с k-ого 
    std::cout << a;
    }
return 0;
}

(извините что так много вопросов по этому коду)


Ответы (1 шт):

Автор решения: Harry

Давайте уже закроем эту тему...

void doit(unsigned long a, unsigned long  k, int c)
{
    unsigned long mask = (unsigned long )-1;
    mask >>= 32 - k;
    switch(c)
    {
    case 1: a = a & ~mask; break;
    case 2: a = a ^ (mask+1); break;
    case 3: a = a & mask;  break;
    }
    cout << a << endl;
}

Если хочется вычислять mask через цикл, то вместо

    unsigned long mask = (unsigned long )-1;
    mask >>= 32 - k;

пишем

unsigned long mask = 0;
for(int i = 0; i < k; ++i) mask = (mask << 1)|1;
→ Ссылка