C++: написать функцию, которая для заданного числа х печатает количество пар(расположенных последовательно) одинаковых битов

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

#include <iostream>
#include <bitset>
using namespace std;

int Count(unsigned a)
{
    int counter = 0, i = 0;
    unsigned k = a >> 1;

    while (++i != 8)
    {
        if (!(a ^ k))
            counter++;
        a >>= 1;
    }
    return counter;
}

int main()
{
    unsigned digit;
    do {
        cin >> digit;
    } while (digit > 65535 || digit < 0);
    cout << bitset<sizeof(unsigned int) * 2>(digit) << endl;
    unsigned k = digit >>= 1;
    cout << Count(digit);
    return 0;
}

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

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

Ну, раз вы используете bitset, значит, это в рамках задания. Раз вы не знаете точно представление числа - значит, придется использовать шаблон...

template<typename Int>
int pairs(Int n)
{
    static_assert(is_integral_v<Int> && is_unsigned_v<Int>);
    constexpr int bits = sizeof(Int)*8;
    bitset<bits> b(n);
    int p = 0;
    for(int i = 1; i < bits; ++i)
        p += (b[i] == b[i-1]);
    return p;
}

Это годится? Полный код (опущенный :) до С++14) - тут: https://ideone.com/ivWJ6x

Не устраивает bitset? Без проблем:

template<typename Int>
int pairs(Int n)
{
    static_assert(is_integral_v<Int> && is_unsigned_v<Int>);
    constexpr int bits = sizeof(Int)*8;
    int p = 0;
    for(int i = 1; i < bits; ++i)
        p += (((n>>i)&1) == ((n>>(i-1))&1));
    return p;
}

Надо именно для байта? Опять же проще простого...

int bytePairs(unsigned char n)
{
    int p = 0;
    for(int i = 1; i < 8; ++i)
        p += (((n>>i)&1) == ((n>>(i-1))&1));
    return p;
}

Для особо ленивых, не желающих думать самостоятельно, отбрасываем ведущие нули.

int bytePairs(unsigned char n)
{
    int p = 0, i = 7;
    if (n < 3) return 0;
    for(;!(n>>i);--i);
    for(; i > 0; --i)
        p += (((n>>i)&1) == ((n>>(i-1))&1));
    return p;
}

Куда приезжать мыть полы?...

→ Ссылка