Easyelectronics.ru • Просмотр темы - развернуть битовый массив

Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2018, 07:45

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:15 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2929
а добавьте в структуру ещё
unsigned c : 1;
и посмотрите что получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:28 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Проверил, ничего не изменилось :
Цитата:
COMMON 0x0000000020000024 0xb ./src/main.o
0x0000000020000024 nbt
0x0000000020000026 q2
0x000000002000002a bit
0x000000002000002c cnt
0x000000002000002e q1

как и в первом случае размер структуры кратен самому большому элементу (в моем случае uint16_t - 2 байта). А так как второй элемент у меня однобайтовый, а выделено на него 2-ва байта, то во втором байте расположился бит C.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:36 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2929
ну тогда ((packed, align(4))) надо обязательно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:41 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2114
Посмотрите, как расположена в памяти c1 (по исходной структуре топикстартера)
Вложение:
Без-имени-1.jpg
Без-имени-1.jpg [ 76.65 Кб | Просмотров: 529 ]


Я ж говорю - великое дело - нормальный отладчик с браузером памяти. А то вот буквально в соседней теме человеки бодаются за наиболее кошерное ПО


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:53 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Мы не о том говорили, у вас структура расположилась в памяти с адреса 1fe4 - то есть кратного 4-м. Но это частный случай. Так как максимальный элемент структуры 1 байт и структура объявлена packed, то она может расположиться в памяти с адреса кратного 1. А это вызовет ошибку адресации при обращении к этой памяти как к слову. _pv указал как правильно объявить структуру что бы она всегда начиналась с адреса кратного 4-м.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 22:14 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2929
но так как по размеру структура в тоже кратна только 2 байтам а не 4, то и переворачивать её придётся по 2 два байта, а не по 4, соответственно можно и вообще по одному байту переворачивать, как BusMaster в начале предложил, разницы особой не будет, а на выравнивание тогда можно вообще забить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 22:25 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Конечно можно, но я обратил ваше внимание на ваш конкретный случай. Где вы сначала создали структуру (packed), а потом присвоили адрес структуры 4-х байтному указателю. А переворачивать можно и побитно :) , в этой ветке даже есть код. Но быстрее всего (всего 5 тактов) это будет по 4 байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 11:53 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 320
Ребят, спасибо за участие, но Вы отвлеклись. проблема в том, что в структуре находятся поля не кратные байту, и переворачивание хоть побайтно, хоть по словам ломает исходную информацию, так как информация попадает на границу байтов-слов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 13:16 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2929
а какая разница где они находятся, для всей структуры бит из позиции N перевернётся в 144-N,
или надо что ли каждое поле перевернуть оставив при этом со своим смещением на старом месте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 13:55 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 320
_pv писал(а):
а какая разница где они находятся, для всей структуры бит из позиции N перевернётся в 144-N,

еслиинформация не кратна байту, то при переворачивании инфа будет испорчена на границах байта-слова:
к примеру в байте 10101100 нужная инфа, при переворачивании байта = 00110101 инфа уже другая
_pv писал(а):
или надо что ли каждое поле перевернуть оставив при этом со своим смещением на старом месте?
похоже на то


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 14:30 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Биты переворачиваются правильно. Видно ТС сам толком не знает что нужно. Опишите всю задачу целиком. Что откуда нужно получить и куда отправить.

ЗЫ:У меня давно закрались подозрения ;), когда увидел структуру в которой CRC и утверждение что структуру нужно развернуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 14:50 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 320
void1509 писал(а):
Биты переворачиваются правильно. Видно ТС сам толком не знает что нужно. Опишите всю задачу целиком. Что откуда нужно получить и куда отправить.

есть структура, листинг которой приводил выше, которая укладывается в массив из 18 байт, потом этот массив выдаётся побайтно в последовательный порт, для правильной работы принимающего устройства, которое принимает байты и необходим "разворот".
void1509 писал(а):
ЗЫ:У меня давно закрались подозрения ;), когда увидел структуру в которой CRC и утверждение что структуру нужно развернуть.
тка как внешнему устройству невозможно изменить логику работы и необходим разворот.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:12 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Я пнимаю, что есть некое устройство со своим протоколом обмена. Но хотелось бы увидеть первоисточник - к примеру даташит на устройство с описанием данного протокола.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:14 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 320
void1509 писал(а):
Я пнимаю, что есть некое устройство со своим протоколом обмена. Но хотелось бы увидеть первоисточник - к примеру даташит на устройство с описанием данного протокола.

увы, нету даташита и описания протокола, закрытая инфа..., всё что мог, привёл выше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:27 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
вот тут обсуждалось побитовое вычитывание байтового массива

в вашем случае можете прям как _pv предложил, пробежаться по 144 битам этим,
Цитата:
Код:
if src[src_offset>>3] & (1<<(src_offset++&7)) dst[dst_offset>>3] |= (1<<(dst_offset++&7)) else dst[dst_offset>>3] &= ~(1<<(dst_offset++&7));


только естественно переписав индексы dst_offset и src_offset


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:32 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 473
Похоже это из мира грёбаного юникода, который практически невозможно понять без бутылки водки.
Начнём с того что ответ железяки из мира динозавров - выглядит достаточно странно, но зато имеет хорошее описание. Последовательность получается такая:
144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129 и так далее, до нуля - это описание бит.
при этом 144,143,142,141 является одним полем, с младшим битом 141 /// 140,139,138,137,136,135 вторым полем, с младшим битом 135 , и так далее
А теперь, как они падают в память нормального компьютера:
137,138,139,140,141,142,143,144 первый байт, 129,130,131,132,133,134,135,136 второй байт
Падают именно так, хотя на экране видим "нормальную" изначальную последовательность.
И теперь к этой "нормальной" последовательности сверху накладывается структура. Естественно совпадений не будет. Для совпадения необходимо поменять байты местами - от младшего к старшему. Развернуть описание структуры. И кстати - если в документах структура заканчивается на бите 135 - то всю её необходимо сдвинуть, в начале у вас будет пустое пространство.
А потом выпить ещё водки, и забыть всё это как страшный сон.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:44 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
Была задача - развернуть структуру. Задача решена - было приведено несколько вариантов обработки (по байтно, по словно, по битно), но все они именно разворачивали структуру (дают один и тот же результат). В каком виде оно надо ТС - не известно. Ему казалось, что нужно развернуть структуру, может и не нужно. Оказать какую-то еще помощь не возможно, так как не известно - чего надо. Описание устройства ТС дать не может. Замкнутый круг. Получается - помогите разобраться - с чем ? - а я вам не скажу.
- Мама, жарьте рыбу !
- зятек, так нет же рыбы !
- мама - вы жарьте, рыба будет !

- Помогите разобраться !
- с чем ?
- вы помогите, с чем я сам знаю !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 17:33 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 320
cheblin писал(а):
вот тут обсуждалось побитовое вычитывание байтового массива

в вашем случае можете прям как _pv предложил, пробежаться по 144 битам этим,
Цитата:
Код:
if src[src_offset>>3] & (1<<(src_offset++&7)) dst[dst_offset>>3] |= (1<<(dst_offset++&7)) else dst[dst_offset>>3] &= ~(1<<(dst_offset++&7));


только естественно переписав индексы dst_offset, src_offset

по приведённой Вами ссылке на ветку форума, прочитал, можно более подробней что за индексы dst_offset, src_offset?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 18:26 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
тут был неправильный код


Последний раз редактировалось cheblin 22 фев 2018, 02:44, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 18:41 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2114
Ёбаный бегемот... Чукча не читатель... Уже сто раз обсудили обертку ассемблерных инструкций реверса бит, а тут исчо адын чел пишет еще одну ху... фигню, да еще и сопровождает замечанем "хуй знает, че сочинил".

Суть траблы у ТС: Получил поток по UART, вероятно, не в том порядке битов. Надо реверснуть порядок битов. Есть два варианта - либо в каждом полном байте порядок битов не тот, либо в полном сообщении нужно реверснуть.
Я ж в сотый раз говорю - ну посмотрите вы этот ёбаный отладчик - как биты расположились в исходном массиве и как их надо расположить так, чтобы было удобно (верно) читать/работать.
Ну youre bunny wrote, ну нахера снова писать какую-то дичь, перечисляя номера битов, как для младших школьников - 141, 140, 139 - ну ебена вошь, да всё уже и без того ясно, как ёбаный крокодил...


Последний раз редактировалось BusMaster 21 фев 2018, 19:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 19:10 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
cheblin писал(а):
вот код. сразу скажу не тестировал. основная идея понятна.
Код:
void reverse_bits(uint8_t * bytes, uint32_t bits) {
   for (int32_t i = bits >> 1; -1 < i; i--)
      if ((bytes[i >> 3] & 1 << (i & 7)) != bytes[bits - i >> 3] & 1 << (bits - i & 7))
         if (bytes[i >> 3] & 1 << (i & 7))
         {
            bytes[i >> 3] |= 1 << (i & 7);
            bytes[bits - i >> 3] |= 1 << (bits - i & 7);
         }
         else
         {
            bytes[i >> 3] &= ~(1 << (i & 7));
            bytes[bits - i >> 3] &= ~(1 << (bits - i & 7));
         }
}

Чудной у вас какой-то алгоритм
Код:
void reverse_bits(uint8_t * bytes, uint32_t bits) {
   for (int32_t i = bits >> 1; -1 < i; i--)  // счетчик от bits / 2 до -1
      if ((bytes[i >> 3] & 1 << (i & 7)) != bytes[bits - i >> 3] & 1 << (bits - i & 7)) // сравниваем биты
                                                                        //симметрично с начала счета и с конца
         if (bytes[i >> 3] & 1 << (i & 7))   // если биты не равны - проверить бит i если в 1
         {
            bytes[i >> 3] |= 1 << (i & 7);  // установить в 1 тот же бит что выше проверяли (НАФИГА???)
            bytes[bits - i >> 3] |= 1 << (bits - i & 7);  // установить бит i от окончания счета
         }
         else   // если бит i в 0
         {
            bytes[i >> 3] &= ~(1 << (i & 7)); // очистить бит i от начала счета (опять же НАФИГА ???)
            bytes[bits - i >> 3] &= ~(1 << (bits - i & 7)); // очистить бит i от окончания счета
         }
}


Вообщем самый чудной алгоритм из всех приведенных в этой ветке.
ЗЫ: Я думаю что строки с надписью НАФИГА нужно поменять местами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 21:37 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
тут был неправильный код


Последний раз редактировалось cheblin 22 фев 2018, 02:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 21:59 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2114
Да ну блин, ну что же вы, ну блин, человеки, люди, ну опомнитесь... Прекратите изобредать всякую фигню. Ну уже же обсосали и обсудили, и даже нашли наиболее короткий из вариантов! Ну есть же инструкция реверса битов в АРМ-ядре! Ну едрическая вошь, ну какого долбаного негра продолжать писать непотребную херомантию с "ифами"? Это же срань господня...
и ведь обязательно найдется еще один китайский чукча, который предложит свой "вариант" if-else a|b>>3|b<<a | ~a|b
Или вы ожидаете, что компилятор с искусственным интеллектом прочтет ваши мысли и из этого сраноподобного кода сделает красивое ассемблерное rbit??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 22 фев 2018, 07:38 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1175
Откуда: Китай, Пекин
у кого не ARM, STM8 к примеру, вот проверенный код
Код:
void reverse_bits(uint8_t* bytes, uint32_t bits)
{
   int32_t i = (bits >> 1) - 1;
   bits--;
   for (; -1 < i; i--)
      if (((bytes[i >> 3] & 1 << (i & 7)) == 0) != ((bytes[bits - i >> 3] & 1 << (bits - i & 7)) == 0))
      {
         bytes[i >> 3] ^= 1 << (i & 7);
         bytes[bits - i >> 3] ^= 1 << (bits - i & 7);
      }
}


Последний раз редактировалось cheblin 22 фев 2018, 14:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 22 фев 2018, 13:49 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 456
ну с инверсией бит ясно, а чего это у вас за такой хитрый if. (выражение) == 0 != (выражение) == 0 честно говоря подобной записи не встречал.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB