Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
#1

Сравнение байтов в bitset - C++

12.11.2013, 23:15. Просмотров 1691. Ответов 25
Метки нет (Все метки)

Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset<32>)
Просто кроме, как кейсом, ничего в голову не приходит. Получается очень громоздко. В идеальном варианте, надо расположить байты по возрастанию, одинаковые оставить на месте. Но мне, пока что нужна только функция сравнения этих байтов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
13.11.2013, 01:26     Сравнение байтов в bitset #2
Читай про битовые операции с числами
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:34  [ТС]     Сравнение байтов в bitset #3
Так а смысл их использовать, имея возможность исползовать bitset. Проблемы написать самому у меня нету, но получается слишком громоздкая функция. Думал, может кто то сможет предложить что то более-менее компактное
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
13.11.2013, 01:43     Сравнение байтов в bitset #4
Цитата Сообщение от Dread1 Посмотреть сообщение
Так а смысл их использовать
А смысл вообще писать на С++ ?
Цитата Сообщение от Dread1 Посмотреть сообщение
имея возможность исползовать bitset.
А что мешает ?

http://www.cplusplus.com/reference/b...set/operators/

Добавлено через 6 минут
Делаеш "XOR", инвертируешь, накладываешь маску по трем битам с помощь "И" приводишь к bool
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:43  [ТС]     Сравнение байтов в bitset #5
ну и опять же. Смысл то какой в этом? Это не уменьшит объёма функции
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
13.11.2013, 02:00     Сравнение байтов в bitset #6
А код не должен быть малообъемным, он должен быть рабочим и ясным.

Лично я не знаю куда меньше, тут код в одну строку

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <bitset>
using namespace  std;
 
int main()
{
 
bitset<32> a(string("10111"));
bitset<32> b(string("00111"));
bitset<32> c(string("10101"));
 
bitset<32> mask(string("111"));
 
cout<< boolalpha << ( (a&mask) == (b&mask) ) <<endl;
cout<< boolalpha << ( (a&mask) == (c&mask) ) <<endl;
 
return 0; 
}
http://codepad.org/YlO2Ac6m
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 02:11  [ТС]     Сравнение байтов в bitset #7
видимо, я не смог понятно объяснить задание. У нас, скажем
C++
1
bitset<32> asd
имеет вид каких 32 подряд идущих бита. То есть 4 байта подряд. Нам нужно поменять их так, чтобы байты шли по убыванию(сравнивать надо 3 первые бита в байте, они же главные) Если байты имеют одинаковые главные биты, оставить на своём месте.
stima
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 2
13.11.2013, 03:55     Сравнение байтов в bitset #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <vector>
#include <bitset>
#include <iostream>
#include <algorithm>
 
typedef std::bitset<8> byte;
 
struct comparator
{
    bool operator() (const byte& lhs, const byte& rhs)
    {
        //2.00 am :{
        return (lhs | byte(std::string("11111000"))).to_ulong() < 
               (rhs | byte(std::string("11111000"))).to_ulong();
    }
};
 
std::ostream& operator<<(std::ostream& out, const std::vector<byte>& bytes)
{
    if (bytes.empty())
        return out;
    
    std::vector<byte>::const_iterator it = bytes.begin(), last = --bytes.end();
    for ( ; it != last; ++it)
        std::cout << *it << std::endl;
    std::cout << *last;
    
    return out;
}
 
int main()
{
    std::vector<byte> bytes;
    
    bytes.push_back(byte(std::string("00000111")));
    bytes.push_back(byte(std::string("00000010")));
    bytes.push_back(byte(std::string("00000001")));
    bytes.push_back(byte(std::string("00000101")));
 
 
    std::cout << "not sorted" << std::endl;
    std::cout << bytes << std::endl;
 
    std::sort(bytes.begin(), bytes.end(), comparator());
 
    std::cout << "sorted by first 3 bits" << std::endl;
    std::cout << bytes << std::endl;
 
    return 0;
}
Добавлено через 3 минуты
Еще как вариант (не проверял)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct comparator
{
    bool operator() (const byte& lhs, const byte& rhs)
    {
        for (int i = 2; i >= 0; ++i)
       {
            if (lhs.test(i) && rhs.test(i)) continue;
 
            return lhs.test(i);
       }
 
        return fasle;
    }
};
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.11.2013, 11:32     Сравнение байтов в bitset #9
Цитата Сообщение от Dread1 Посмотреть сообщение
Нам нужно поменять их так, чтобы байты шли по убыванию
Вы оперируете с байтами, а используете класс, который заточен на работу с битами. Почему бы просто не взять вектор каких-нибудь unsigned char.
P.S. собственно stima уже привел нечто подобное.
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 19:37  [ТС]     Сравнение байтов в bitset #10
Вобщем, то что было предложено- не совсем то что мне нужно. Появился однако другой вопрос. Как можно инициализировать переменную типа bitset<32> переменной типа unsigned long? С простым long всё работало, но внезапно понадобился unsigned long.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
13.11.2013, 19:51     Сравнение байтов в bitset #11
Цитата Сообщение от Dread1 Посмотреть сообщение
Вобщем, то что было предложено- не совсем то что мне нужно.
А ты вообще знаешь чЁ те надо ?

Блин уже сказали bitset<32> для битов, не для байтов ...
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:02  [ТС]     Сравнение байтов в bitset #12
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.11.2013, 20:42     Сравнение байтов в bitset #13
Цитата Сообщение от Dread1 Посмотреть сообщение
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
Странный вопрос, потому что конструктор принимает unsigned long. http://www.cplusplus.com/reference/b...bitset/bitset/
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:58  [ТС]     Сравнение байтов в bitset #14
Это да, но почему то, инициализация переменной данного типа у меня не срабатывает. Пишет невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.11.2013, 21:41     Сравнение байтов в bitset #15
Dread1, приведите код, вызывающий ошибку.
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:11  [ТС]     Сравнение байтов в bitset #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <bitset>
using namespace std;
 
bitset<32> converter(unsigned int);
 
 
int main()
{
    unsigned int in=12345678;
    converter(in);
    system("PAUSE");
    return 0;
}
 
 
bitset<32> converter(unsigned int ab)
{
    bitset<32> inbit=bitset<32>(ab);
return 0;
}
Даже банально, такой код не работает
stima
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 2
13.11.2013, 23:16     Сравнение байтов в bitset #17
C++
1
2
3
4
5
6
7
#include <bitset>
 
int main()
{
    std::bitset<32> bits(12345678);
    return 0;
}
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:26  [ТС]     Сравнение байтов в bitset #18
ну о чём я говорил, мне через переменную, которую я с клавиатуры вводить буду надо инициализировать битсет.
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
13.11.2013, 23:39     Сравнение байтов в bitset #19
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 23:48     Сравнение байтов в bitset
Еще ссылки по теме:

C++ Множество элементов типа bitset
Запись bitset в bmp C++
C++ Аналог класса bitset (Стандарт C++11)
C++ Разобраться почему не компилируется код (использование std::bitset)
C++ внести char* в bitset

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:48  [ТС]     Сравнение байтов в bitset #20
Цитата Сообщение от castaway Посмотреть сообщение
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
Ну вообще то, это в большинстве компиляторов одно и то же, так как в последних стандартах языка c++ long~int. Это раньше int бралось как shot. Тем не менее, даже если бы была разница сейчас, то на положение дел это никак не повлияло.
Yandex
Объявления
13.11.2013, 23:48     Сравнение байтов в bitset
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru