Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
1

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

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

Author24 — интернет-сервис помощи студентам
Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset<32>)
Просто кроме, как кейсом, ничего в голову не приходит. Получается очень громоздко. В идеальном варианте, надо расположить байты по возрастанию, одинаковые оставить на месте. Но мне, пока что нужна только функция сравнения этих байтов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2013, 23:15
Ответы с готовыми решениями:

Сравнение двух массивов байтов
как максимально просто сравнить два массива байтов? (byte) я имею ввиду без лишнего кода, понятно...

Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов
Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов. Создать строку...

Сканирование байтов в памяти, и получение начального адреса байтов
Привет форумчане! У меня вопрос, как просканировать память у процесса так, чтобы получить адрес...

Если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то она будет работать быстрей?
Как думаете если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то на будет...

25
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 01:26 2
Читай про битовые операции с числами
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:34  [ТС] 3
Так а смысл их использовать, имея возможность исползовать bitset. Проблемы написать самому у меня нету, но получается слишком громоздкая функция. Думал, может кто то сможет предложить что то более-менее компактное
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 01:43 4
Цитата Сообщение от Dread1 Посмотреть сообщение
Так а смысл их использовать
А смысл вообще писать на С++ ?
Цитата Сообщение от Dread1 Посмотреть сообщение
имея возможность исползовать bitset.
А что мешает ?

http://www.cplusplus.com/refer... operators/

Добавлено через 6 минут
Делаеш "XOR", инвертируешь, накладываешь маску по трем битам с помощь "И" приводишь к bool
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:43  [ТС] 5
ну и опять же. Смысл то какой в этом? Это не уменьшит объёма функции
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 02:11  [ТС] 7
видимо, я не смог понятно объяснить задание. У нас, скажем
C++
1
bitset<32> asd
имеет вид каких 32 подряд идущих бита. То есть 4 байта подряд. Нам нужно поменять их так, чтобы байты шли по убыванию(сравнивать надо 3 первые бита в байте, они же главные) Если байты имеют одинаковые главные биты, оставить на своём месте.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 11:32 9
Цитата Сообщение от Dread1 Посмотреть сообщение
Нам нужно поменять их так, чтобы байты шли по убыванию
Вы оперируете с байтами, а используете класс, который заточен на работу с битами. Почему бы просто не взять вектор каких-нибудь unsigned char.
P.S. собственно stima уже привел нечто подобное.
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 19:37  [ТС] 10
Вобщем, то что было предложено- не совсем то что мне нужно. Появился однако другой вопрос. Как можно инициализировать переменную типа bitset<32> переменной типа unsigned long? С простым long всё работало, но внезапно понадобился unsigned long.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 19:51 11
Цитата Сообщение от Dread1 Посмотреть сообщение
Вобщем, то что было предложено- не совсем то что мне нужно.
А ты вообще знаешь чЁ те надо ?

Блин уже сказали bitset<32> для битов, не для байтов ...
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:02  [ТС] 12
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 20:42 13
Цитата Сообщение от Dread1 Посмотреть сообщение
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
Странный вопрос, потому что конструктор принимает unsigned long. http://www.cplusplus.com/refer... et/bitset/
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:58  [ТС] 14
Это да, но почему то, инициализация переменной данного типа у меня не срабатывает. Пишет невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 21:41 15
Dread1, приведите код, вызывающий ошибку.
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:11  [ТС] 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;
}
Даже банально, такой код не работает
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
13.11.2013, 23:16 17
C++
1
2
3
4
5
6
7
#include <bitset>
 
int main()
{
    std::bitset<32> bits(12345678);
    return 0;
}
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:26  [ТС] 18
ну о чём я говорил, мне через переменную, которую я с клавиатуры вводить буду надо инициализировать битсет.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
13.11.2013, 23:39 19
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
1
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:48  [ТС] 20
Цитата Сообщение от castaway Посмотреть сообщение
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
Ну вообще то, это в большинстве компиляторов одно и то же, так как в последних стандартах языка c++ long~int. Это раньше int бралось как shot. Тем не менее, даже если бы была разница сейчас, то на положение дел это никак не повлияло.
0
13.11.2013, 23:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2013, 23:48
Помогаю со студенческими работами здесь

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

Bitset на VC++
Помогите, пожалуйста, новичку. В VC++.net пытаюсь запустить выражение CString Sl =...

Bitset to int
Здравствуйте! вот пробую: bitset &lt;8&gt; id_paketa = 00000010; cout &lt;&lt; id_paketa &lt;&lt; &quot; &quot; &lt;&lt;...

Задача по bitset
Задача: Предположим, что существует последовательность 1,2,3,5,8,13,21. Инициализируйте набор...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru