Russian Qt Forum
Март 29, 2024, 16:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: несколько int в массив bool побитово.  (Прочитано 4799 раз)
Alexey_Bulatov
Гость
« : Октябрь 29, 2018, 16:30 »

Товарищи, есть задачка, как решить большим кол-вом строк знаю, но хочу как-то компактно.

есть 3 переменных типа int;
есть массив bool на 48 элементов;

надо взять от каждого инта по 16 первых бит и записать их в массив булов.

хелп)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Октябрь 29, 2018, 17:36 »

Код
C++ (Qt)
void ThreeInt2Bool( const int src[3], bool dst[48] )
{
 int pos = 0;
 for (int i = 0; i < 3; ++i)
  for (int j = 0; j < 16; ++j)
   dst[pos++] = (src[i] >> j) & 1;
}
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 862


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Октябрь 29, 2018, 17:41 »

Одна строка лишняя)))
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Alexey_Bulatov
Гость
« Ответ #3 : Октябрь 30, 2018, 08:33 »

Благодарю!
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Октябрь 30, 2018, 09:19 »

Одна строка лишняя)))
Две, одного "for" и "memcpy" хватит.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 30, 2018, 09:23 »

Одна строка лишняя)))
Две, одного "for" и "memcpy" хватит.
Прошу исполнить  Улыбающийся
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Октябрь 30, 2018, 10:51 »

memcpy не прокатит для bool[48], так как он  занимает 48 байт. Мой способ на другом типе(у автора тип массива не указан).

Код:
QByteArray ba;
QList<int> ia = {0x00FFFF0F, 0x00FF0000, 0x00FFFF00};

for(int i=0; i < 3; ++i) {
    ba.append(ia[i] & 0x00FF).append((ia[i] >> 8) & 0xFF);

Хотя тут QBitArray нужен для массива.
« Последнее редактирование: Октябрь 30, 2018, 10:54 от deMax » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 862


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Октябрь 30, 2018, 11:09 »

Не так, не? ))

Код
C++ (Qt)
void ThreeInt2Bool( const int src[3], bool dst[48] )
{
 for (int i = 0; i < 48; ++i)
   dst[i] = (src[i/16] >> (i%16)) & 1;
}
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Октябрь 30, 2018, 11:15 »

QBitArray bita(48);
QList<int> ia = {0x00FFFF0F, 0x00FF0000, 0x00FFFF00};
uint16_t *pBit = (uint16_t*)bita.data_ptr()->data();
for(int i=0; i < 3; ++i)
    pBit = ia & 0xFFFF;

Не так, не? ))
i/16 и i%16, жирные операции, но компилятор это исправит.
Записан
Alexey_Bulatov
Гость
« Ответ #9 : Октябрь 30, 2018, 16:23 »

да, именно bool[48] на 48 байт у меня.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Октябрь 30, 2018, 22:07 »

Компилетайм биты! Улыбающийся

Код
C++ (Qt)
constexpr bitset<48> bits(uint16_t i1, uint16_t i2, uint16_t i3) {
   return {uint64_t(i1) << 32 | uint64_t(i2) << 16 | i3};
}
 

https://ideone.com/5No9tm
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 22.