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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
12.11.2013, 23:15     Сравнение байтов в bitset #1
Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset<32>)
Просто кроме, как кейсом, ничего в голову не приходит. Получается очень громоздко. В идеальном варианте, надо расположить байты по возрастанию, одинаковые оставить на месте. Но мне, пока что нужна только функция сравнения этих байтов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2013, 23:15     Сравнение байтов в bitset
Посмотрите здесь:

Почему не получается использовать bitset в VC++? C++
C++ Сложение двоичных чисел, представленных в bitset
Задача по bitset C++
динамический bitset возможно ли такое? C++
C++ Bitset to int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 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
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 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
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 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
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
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
:)
Эксперт С++
4378 / 3221 / 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
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 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
:)
Эксперт С++
4378 / 3221 / 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
:)
Эксперт С++
4378 / 3221 / 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
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
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
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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)

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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru