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

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

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

Студворк — интернет-сервис помощи студентам
Помогите написать функцию, которая сравнивает байты (а точнее первые 3 бита в каждом байте bitset<32>)
Просто кроме, как кейсом, ничего в голову не приходит. Получается очень громоздко. В идеальном варианте, надо расположить байты по возрастанию, одинаковые оставить на месте. Но мне, пока что нужна только функция сравнения этих байтов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2013, 23:15
Ответы с готовыми решениями:

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

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

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

25
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 01:26
Читай про битовые операции с числами
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 01:34  [ТС]
Так а смысл их использовать, имея возможность исползовать bitset. Проблемы написать самому у меня нету, но получается слишком громоздкая функция. Думал, может кто то сможет предложить что то более-менее компактное
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 01:43
Цитата Сообщение от 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  [ТС]
ну и опять же. Смысл то какой в этом? Это не уменьшит объёма функции
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 02:00
А код не должен быть малообъемным, он должен быть рабочим и ясным.

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

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  [ТС]
видимо, я не смог понятно объяснить задание. У нас, скажем
C++
1
bitset<32> asd
имеет вид каких 32 подряд идущих бита. То есть 4 байта подряд. Нам нужно поменять их так, чтобы байты шли по убыванию(сравнивать надо 3 первые бита в байте, они же главные) Если байты имеют одинаковые главные биты, оставить на своём месте.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
13.11.2013, 03:55
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
Цитата Сообщение от Dread1 Посмотреть сообщение
Нам нужно поменять их так, чтобы байты шли по убыванию
Вы оперируете с байтами, а используете класс, который заточен на работу с битами. Почему бы просто не взять вектор каких-нибудь unsigned char.
P.S. собственно stima уже привел нечто подобное.
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 19:37  [ТС]
Вобщем, то что было предложено- не совсем то что мне нужно. Появился однако другой вопрос. Как можно инициализировать переменную типа bitset<32> переменной типа unsigned long? С простым long всё работало, но внезапно понадобился unsigned long.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2013, 19:51
Цитата Сообщение от Dread1 Посмотреть сообщение
Вобщем, то что было предложено- не совсем то что мне нужно.
А ты вообще знаешь чЁ те надо ?

Блин уже сказали bitset<32> для битов, не для байтов ...
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 20:02  [ТС]
на данный момент мне нужен ответ только на мой последний вопрос. Ибо прога написана, но не получается использовать unsigned long
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 20:42
Цитата Сообщение от 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  [ТС]
Это да, но почему то, инициализация переменной данного типа у меня не срабатывает. Пишет невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.11.2013, 21:41
Dread1, приведите код, вызывающий ошибку.
0
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:11  [ТС]
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
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  [ТС]
ну о чём я говорил, мне через переменную, которую я с клавиатуры вводить буду надо инициализировать битсет.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.11.2013, 23:39
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
1
9 / 9 / 4
Регистрация: 16.10.2012
Сообщений: 61
13.11.2013, 23:48  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Ты же сам говорил про тип unsigned long, а используешь unsigned int.
Ну вообще то, это в большинстве компиляторов одно и то же, так как в последних стандартах языка c++ long~int. Это раньше int бралось как shot. Тем не менее, даже если бы была разница сейчас, то на положение дел это никак не повлияло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2013, 23:48
Помогаю со студенческими работами здесь

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

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

Bitset на VC++
Помогите, пожалуйста, новичку. В VC++.net пытаюсь запустить выражение CString Sl = '1001001001000'; bitset &lt;32&gt;bitvec2(Sl, 2, 4);...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru