Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset<32>)
Просто кроме, как кейсом, ничего в голову не приходит. Получается очень громоздко. В идеальном варианте, надо расположить байты по возрастанию, одинаковые оставить на месте. Но мне, пока что нужна только функция сравнения этих байтов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2013, 23:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение байтов в bitset (C++):

Bitset<0> - C++
Не на англоязычных просторах ни на наших не нашел, что же означает определение как: bitset&lt;0&gt; Моё предположение, это очищенный...

Bitset to int - C++
Здравствуйте! вот пробую: bitset &lt;8&gt; id_paketa = 00000010; cout &lt;&lt; id_paketa &lt;&lt; &quot; &quot; &lt;&lt; id_paketa.to_ullong(); Почему получается...

Задача по bitset - C++
Задача: Предположим, что существует последовательность 1,2,3,5,8,13,21. Инициализируйте набор bitset&lt;32&gt; так, чтобы в каждой из позиций,...

Запись bitset в bmp - C++
Всем доброго времени суток, такая проблемка, не могу записать bitset в bmp вроде нашел пример и структуру файла, но рук не хватает ещё)). ...

внести char* в bitset - C++
Всем привет! Хотел бы попросить у вас эффективный способ каким образом можно внести массив символов переменной длины (char buf)...

Аналог класса bitset (Стандарт C++11) - C++
Нужно создать аналог класса Bitset (стандарт C++11) Самому удалось раскопать следующее: //default (1) constexpr bitset()...

25
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,597
Записей в блоге: 17
13.11.2013, 01:26 #2
Читай про битовые операции с числами
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:34  [ТС] #3
Так а смысл их использовать, имея возможность исползовать bitset. Проблемы написать самому у меня нету, но получается слишком громоздкая функция. Думал, может кто то сможет предложить что то более-менее компактное
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,597
Записей в блоге: 17
13.11.2013, 01:43 #4
Цитата Сообщение от Dread1 Посмотреть сообщение
Так а смысл их использовать
А смысл вообще писать на С++ ?
Цитата Сообщение от Dread1 Посмотреть сообщение
имея возможность исползовать bitset.
А что мешает ?

http://www.cplusplus.com/reference/bitset/bitset/operators/

Добавлено через 6 минут
Делаеш "XOR", инвертируешь, накладываешь маску по трем битам с помощь "И" приводишь к bool
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:43  [ТС] #5
ну и опять же. Смысл то какой в этом? Это не уменьшит объёма функции
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,597
Записей в блоге: 17
13.11.2013, 02:00 #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
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 02:11  [ТС] #7
видимо, я не смог понятно объяснить задание. У нас, скажем
C++
1
bitset<32> asd
имеет вид каких 32 подряд идущих бита. То есть 4 байта подряд. Нам нужно поменять их так, чтобы байты шли по убыванию(сравнивать надо 3 первые бита в байте, они же главные) Если байты имеют одинаковые главные биты, оставить на своём месте.
0
stima
495 / 345 / 43
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
13.11.2013, 03:55 #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;
    }
};
2
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.11.2013, 11:32 #9
Цитата Сообщение от Dread1 Посмотреть сообщение
Нам нужно поменять их так, чтобы байты шли по убыванию
Вы оперируете с байтами, а используете класс, который заточен на работу с битами. Почему бы просто не взять вектор каких-нибудь unsigned char.
P.S. собственно stima уже привел нечто подобное.
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 19:37  [ТС] #10
Вобщем, то что было предложено- не совсем то что мне нужно. Появился однако другой вопрос. Как можно инициализировать переменную типа bitset<32> переменной типа unsigned long? С простым long всё работало, но внезапно понадобился unsigned long.
0
Avazart
Эксперт С++
7420 / 5510 / 316
Регистрация: 10.12.2010
Сообщений: 24,597
Записей в блоге: 17
13.11.2013, 19:51 #11
Цитата Сообщение от Dread1 Посмотреть сообщение
Вобщем, то что было предложено- не совсем то что мне нужно.
А ты вообще знаешь чЁ те надо ?

Блин уже сказали bitset<32> для битов, не для байтов ...
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:02  [ТС] #12
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.11.2013, 20:42 #13
Цитата Сообщение от Dread1 Посмотреть сообщение
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
Странный вопрос, потому что конструктор принимает unsigned long. http://www.cplusplus.com/reference/bitset/bitset/bitset/
0
Dread1
7 / 7 / 2
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:58  [ТС] #14
Это да, но почему то, инициализация переменной данного типа у меня не срабатывает. Пишет невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.11.2013, 21:41 #15
Dread1, приведите код, вызывающий ошибку.
0
13.11.2013, 21:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 21:41
Привет! Вот еще темы с ответами:

Множество элементов типа bitset - C++
Хочу создать множество, элементы которого будут иметь тип bitset. Подключаю #include &lt;set&gt; и #include &lt;bitset&gt; Пишу например так ...

Динамический bitset, возможно ли такое? - C++
как известно size в bitset&lt;size&gt; должно быть статической, как реализовать класс с полем bitset&lt;size&gt; в конструктор\параметр которого...

Почему не получается использовать bitset в VC++? - C++
Никак не получается использовать bitset в VC++6 . Очень надо - двоичный вектор . В стандарте описан bitset , но работать отказывается ....

Bitset<8388608> - Stack overflow - C++
Пишу: bitset&lt;8388608&gt; hash; // (256^2)/2 Ошибка: Stakc overflow (ОЗУ&gt;3 Гб, но как я понял приложение не может пользоваться больше...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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