1

Тема: Зміна бітів на протилежні в unsigned int

Потрібно замінити біти на протилежні в unsigned int, а тоді вивести нове unsigned int.
Робив ось так:

unsigned int reverse_bits(unsigned int n)
{
    std::bitset<sizeof(unsigned int) * CHAR_BIT> n_bits(n);
    std::cout << (unsigned int)(n_bits.flip().to_ulong()) << std::endl;
    std::cout << (~n) << std::endl;
    std::string new_bits = std::bitset<sizeof(unsigned int) * CHAR_BIT>(n).to_string();
    new_bits.erase(0, new_bits.find_first_not_of('0'));
    std::bitset<sizeof(char) * CHAR_BIT> second_bits(new_bits);
    std::cout << (unsigned int)(second_bits.flip().to_ulong()) << std::endl;


    return 0;
}

Але в результаті виходить завелике число, бо всі попередні нулі перетворюються в одиниці.
Пробував обрізати за допомогою string, усе одно виходить хибна відповідь.

2

Re: Зміна бітів на протилежні в unsigned int

Teg Miles написав:

Але в результаті виходить завелике число, бо всі попередні нулі перетворюються в одиниці.

Виходить правильна відповідь, це у вас неправильне уявлення про бітові операції.

Teg Miles написав:

усе одно виходить хибна відповідь.

Що ви вводите, що виводиться, і чому ви вважаєте це неправильним?

Подякували: leofun011

3

Re: Зміна бітів на протилежні в unsigned int

Ось це завдання https://www.codewars.com/kata/5959ec605595565f5c00002b
Але я неправильно зрозумів умову, треба не нулі й одиниці міняти, а в зворотному порядку прочитати бінарну форму.

    std::string new_bits = std::bitset<sizeof(unsigned int) * CHAR_BIT>(n).to_string();
    new_bits.erase(0, new_bits.find_first_not_of('0'));
    std::reverse(new_bits.begin(), new_bits.end());
    std::bitset<64> boom(new_bits);
    return (unsigned int)(boom.to_ulong());

4

Re: Зміна бітів на протилежні в unsigned int

unsigned reverse_bits (unsigned n)
{
  unsigned int result = 0;
  for(;n>0;n>>=1)
    result = (result<<1)|(n&1);
  return result;
}
Подякували: Teg Miles1

5

Re: Зміна бітів на протилежні в unsigned int

Teg Miles написав:

Ось це завдання https://www.codewars.com/kata/5959ec605595565f5c00002b

Це задача про бітові оператори.

+ рекурсія

uint32_t reverse_bits(uint32_t n, uint32_t r = 0) {
    return n ? reverse_bits(n >> 1, r << 1 | n & 1) : r;
}

- рекурсія

uint32_t reverse_bits(uint32_t n, uint32_t r = 0) {
    do r = r << 1 | n & 1;
    while(n >>= 1);
    return r;
}

Див. бітові оператори зміщеня.

Подякували: Teg Miles1