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;
}
Куда приезжать мыть полы?...