|
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
|
||||||
Найти последовательность единичных битов25.07.2025, 12:33. Показов 2004. Ответов 17
Есть битовая карта в виде массива uint8_t:
Решение в лоб - это побитовый подсчёт, плюс обработка границ байтов, когда часть последовательности находится в одном байте, а часть в другом (или в случае uint8_t запросто может находиться в трёх, четырёх, большем количестве байт. Существуют ли более эффективные решения?
0
|
||||||
| 25.07.2025, 12:33 | |
|
Ответы с готовыми решениями:
17
Количество единичных битов
Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе |
|
228 / 169 / 71
Регистрация: 14.06.2024
Сообщений: 458
|
|
| 25.07.2025, 12:38 | |
|
предварительно строку собрать?
0
|
|
|
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
|
||||||
| 25.07.2025, 12:51 [ТС] | ||||||
|
Без строк, если имеются в виду последовательности ascii-симовлов.
Ну условно если в виде функции, то примерно так:
Если SIZE = 2, то битовая карта может иметь напримеп вот такой вид: 1100'0001 1110'1010 И в ней может потребоваться найти последовательность 1111, нужно получить её индекс (в данном случае 7).
0
|
||||||
|
2732 / 887 / 330
Регистрация: 10.02.2018
Сообщений: 2,095
|
|
| 25.07.2025, 14:00 | |
|
Eltan, в видео кодеках часто используют битовые структуры для более компактного размещения данных. К примеру некая структура занимает 5 бит и она не обязана лежать в начале байта, часть структуры может в одном байте лежать, а часть в другом. Куча разных битовых структур последовательно слеплены вместе и всё это образует битовый поток. Можно поискать в реализации кодеков некие интересные идеи. В кодеке h264 есть такое понятие как стартовая последовательность бит, вроде "0...01". И есть алгоритм поиска ближайшей стартовой последовательности с произвольного места битового потока. Чем-то похоже на вашу задачу.
Я особо не вникал в тонкости реализации. В общих чертах там есть две основные идеи. Первая идея, делается специальный класс, который позволяет последовательно забирать из битового потока нужное количество бит как целое число выровненное по началу байта. В таком классе используются разные оптимизации и кэширования, что несколько ускоряет работу с битовым потоком. Вторая идея, при поиске последовательности можно шагать не по одному биту, а сразу через несколько бит, но нужно смотреть на искомую и проверяемую последовательности. К примеру, если мы ищем "11111", а текущее проверяемая последовательность "xxxx0", то можно шагнуть сразу на 5 бит, так как младший '0' отсекает возможность появления нужной последовательности ранее.
1
|
|
|
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
|
|
| 25.07.2025, 14:20 [ТС] | |
|
Да, последний момент тоже пришёл сразу в голову, такая оптимизация с перешагиванием заведомо невалидных последовательностей тоже желаема. Спасибо, погуглю.
0
|
|
|
Заблокирован
|
|||||||||
| 25.07.2025, 14:37 | |||||||||
Сообщение было отмечено Eltan как решение
Решение
std::vector<bool> и пусть двое из ларца за тебя пальцы загибают.Добавлено через 4 минуты
![]() Добавлено через 2 минуты
1
|
|||||||||
|
9 / 7 / 2
Регистрация: 02.12.2021
Сообщений: 49
|
||
| 25.07.2025, 15:05 [ТС] | ||
|
0
|
||
|
Заблокирован
|
||
| 25.07.2025, 17:13 | ||
|
0
|
||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
||
| 26.07.2025, 05:07 | ||
|
Если читать из восьмибитного массива,
шестнадцатибитным типом данных (указатель *short), передвигая его побайтно, наверное можно сделать поиск непрерывным. (Переход через границу между ячейками массива) (Думать надо... Неделю...)
0
|
||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
||||
| 26.07.2025, 13:28 | ||||
|
У меня с побитовыми операциями вообще провал... Изучать надо. Несколько раз изучал, что то особо не пристаёт... (Надо что бы по улице идёшь, и в голове решалось) Биты вообще то в числах ищуться, а не в массивах... Добавлено через 2 минуты Со словом быстро, все с++ фантазии как бы отметаються сразу. Добавлено через 25 минут
0
|
||||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
||||||
| 26.07.2025, 15:27 | ||||||
|
С какой долей абстракции это решать то?
Оно там всё раком развёрнуто. Конец одного с началом второго не совпадает... Когда читаешь указателем short, первый и второй байт меняет местами. (индексация)
0
|
||||||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
||||||
| 26.07.2025, 15:48 | ||||||
|
Долбить разворачивая, или долбить напрямую?
0
|
||||||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
|
| 26.07.2025, 15:51 | |
|
0
|
|
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
||||||
| 26.07.2025, 19:33 | ||||||
|
Щитает...
0
|
||||||
|
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,870
|
|
| 26.07.2025, 19:35 | |
|
0
|
|
|
Вездепух
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
|
||
| 03.08.2025, 08:55 | ||
|
0
|
||
|
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 962
|
|||||||
| 15.08.2025, 12:50 | |||||||
|
есть массив байт, который представляет последовательность бит. нужно найти в нем непрерывную последовательность бит заданной длины и вернуть "битовый адрес" с которого начинается последовательность. не хочу писать код полностью, просто поделюсь идеей:
0
|
|||||||
|
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 441
|
|||||||||||||
| 24.08.2025, 14:46 | |||||||||||||
|
Если в вашем массиве преобладают единичные биты, а биты ='0' - встречаются редко и если речь о платформе x86, то для ускорения поиска можно воспользоваться одной из функций: _BitScanForward(), _BitScanForward64(), _BitScanReverse(), _BitScanReverse64(). https://learn.microsoft.com/en... w=msvc-170 При макс. оптимизации такая функция транслируется в единственную команду CPU = BSR или BSF. Простой код:
По листингу видно, что главный цикл (прохода по u32-словам) - довольно короткий и без вызовов функций:
Здесь скомпилено с оптимизацией по размеру (чтобы получить листинг покороче). Но автор может сделать компиляцию с оптимизацией по скорости - тоже всё работает. Если платформа = ARM, то на ней тоже есть подходящая команда: CLZ.
0
|
|||||||||||||
| 24.08.2025, 14:46 | |
|
Помогаю со студенческими работами здесь
18
Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе. Битовые операции: количество нулевых и единичных битов в целом неотрицательном числе
Заменить n левых битов числа x на n левых битов числа y (не могу найти ошибку в коде) Написать функцию, заменяющую n левых битов числа x на n правых инвертированных битов числа y Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|