Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка в коде из-за bitset


Автор: Kseni1995 6.5.2014, 12:48
Не работает программа! Задание было такое: напишите программу invert(p,x,n), возвращающую значение х с инвертированными n-битами, начиная с позиции p ( остальные биты не меняются).

Ввожу, подчеркивает bitset при выводе и выдает такую ошибку: 
]
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
1> error C2440: <function-style-cast>: невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
1> with
1> [
1> _Bits=32
1> ]
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно.

Мой код:

Код

#include <iostream>
#include <bitset>
using namespace std;
unsigned
invert(unsigned x, int p, int n)
{
    int count = sizeof(x) * 8;
    unsigned t = ((unsigned) ~0 << (p - 1)) >> (count - n) << (count - n - p + 1);
    return (~x & t) | (x & ~t);
}
 
int
main()
{
    unsigned x;
    int p, n;
    cout << "Введите x в шестнадцатеричной: ";
    cin >> hex >> x;
    cout << "Введите p позицию и число инвертированных битов n ";
    cin >> dec >> p >> n;
    cout << "Исходный x " << bitset<sizeof(x) * 8>(x) << endl
         << "Инвертированный x " << bitset<sizeof(x) * 8>(invert(x, p, n)) << endl;
    return 0;
}
Подскажите пожалуйста, в чем дело?

Автор: Guinness 6.5.2014, 13:10
http://ideone.com/fxM6Go - тут вроде все компилируется.
В чем работаем, чем компилиурем?

Автор: xvr 6.5.2014, 13:18
Функция invert просто жуть! И маска вычисляется гораздо проще (в 3 операции, а не в 9), а уж результат вообще вычисляется в одну операцию (а не в 5).

Автор: Kseni1995 6.5.2014, 13:40
Цитата(Guinness @ 6.5.2014,  13:10)
http://ideone.com/fxM6Go - тут вроде все компилируется.
В чем работаем, чем компилируем?


Microsoft Visual C++ 2010 Express
Там действительно все вроде так, спасибо!

Добавлено через 1 минуту и 27 секунд
Цитата(xvr @ 6.5.2014,  13:18)
Функция invert просто жуть! И маска вычисляется гораздо проще (в 3 операции, а не в 9), а уж результат вообще вычисляется в одну операцию (а не в 5).

А как нужно?

Автор: xvr 6.5.2014, 13:50
Цитата(Kseni1995 @  6.5.2014,  13:40 Найти цитируемый пост)
А как нужно? 

Код

unsigned
invert(unsigned x, int p, int n)
{
    unsigned t =  ((1<<n)-1)<<p;
    return x ^ t;
}


Автор: Kseni1995 6.5.2014, 17:39
Цитата(xvr @ 6.5.2014,  13:50)
Цитата(Kseni1995 @  6.5.2014,  13:40 Найти цитируемый пост)
А как нужно? 

Код

unsigned
invert(unsigned x, int p, int n)
{
    unsigned t =  ((1<<n)-1)<<p;
    return x ^ t;
}

Спасибо! Действительно проще

Автор: feodorv 9.5.2014, 09:13
xvr,  smile 
Не сочтите за троллинг, но если мне захочется все биты инвертировать? 
Код

invert(0xffffffffu, 0, 32)

в 32-х битном окружении уже http://ideone.com/Sgy5VP...

Автор: xvr 9.5.2014, 09:19
Цитата(feodorv @  9.5.2014,  09:13 Найти цитируемый пост)
Не сочтите за троллинг, но если мне захочется все биты инвертировать? 

Да, это проблема. Надо будет предусмотреть этот частный случай  smile 

Автор: mes 10.5.2014, 11:25
Цитата(xvr @  9.5.2014,  08:19 Найти цитируемый пост)
Да, это проблема. Надо будет предусмотреть этот частный случай

или инвертирoвать лoгику smile
Код

  enum  { maxbits = sizeof(unsigned) *8 };
  unsigned int t = (-1u) >> (maxbits-n) << p;
  return x ^ t;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)