Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.12.2010, 11:45
|
#1
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Как сделать битовый массив в codevision
прошу помочь организовать битовый массив в codevision.
если делать на bool, то на каждый элемент массива выделяется 8 битов (т.е. также как и char). хотелось бы 16 элементов массива поместить в 16 бит
если такое не реализуемое, то что быстрее: обращение к любому элементу массива char [16] или 16 раз сделать сдвиг для определения бита в int (‹‹)?
можно ли сделать битовый массив-стек и работать через указатели?
спасибо
|
|
|
|
08.12.2010, 12:55
|
#2
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: как сделать битовый массив в codevision
Для определения значения бита проще использовать логическое И по маске:
0х1 - bit0
0x2 - bit1
0x4 - bit2
0x8 - bit3
0x10 - bit4
0x20 - bit5
0x40 - bit6
0x80 - bit7
И многие компиляторы так делают.
__________________
misterdi<@>i.ua
|
|
|
|
08.12.2010, 14:18
|
#3
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
а если у меня будет long? 32 маски хранить в памяти? да еще обращатся к ним по имени, а не по индексу
|
|
|
|
08.12.2010, 14:30
|
#4
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от code-by
|
да еще обращатся к ним по имени, а не по индексу
|
Можно по индексу маску сделать if(var & (1 ‹‹ index))
|
|
|
|
08.12.2010, 14:43
|
#5
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от realid
|
Можно по индексу маску сделать if(var & (1 ‹‹ index))
|
такой вариант уже есть... но, наверное, он работает дольше, например при обращении к 15 биту, чем прямой вызов var(15).
|
|
|
|
08.12.2010, 14:56
|
#6
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от code-by
|
такой вариант уже есть... но, наверное, он работает дольше, например при обращении к 15 биту, чем прямой вызов var(15).
|
Нет в Си битовых массивов как вы хотите (хотелось бы 16 элементов массива поместить в 16 бит) и обращаться по индексу типа MassivBits[3] нет возможности.
|
|
|
|
08.12.2010, 15:15
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
а вот так;
Код:
|
//массив масок битов в FLASH. для обращения к битам по переменой
__flash unsigned int mask_bit_int[16] {0x0001,0x0002,0x0004,0x0008,0x0010, ..итд }
unsigned int masiv_bit_int //массив битов в RAM
unsigned char nomer_bita_int //указатель в массиве битов
//сброс бита
masiv_bit_int=masiv_bit_int & !mask_bit_int[nomer_bita_int]
//установка бита
masiv_bit_int=masiv_bit_int | mask_bit_int[nomer_bita_int]
//проверка бита
if ((masiv_bit_int & mask_bit_int[nomer_bita_int])›0) |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 08.12.2010 в 16:34.
|
|
|
|
08.12.2010, 15:22
|
#8
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,530
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от picavr
|
а вот так;
|
if ((masiv_bit_int | mask_bit_int[nomer_bita_int])›0)
всегда будет больше 0.
Нужно if ((masiv_bit_int & mask_bit_int[nomer_bita_int])›0)
|
|
|
|
08.12.2010, 15:54
|
#9
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от picavr
|
а вот так;
Код:
|
//массив масок битов
__flash unsigned int mask_bit_int[16] {0x01,0x02,0x04,0x08,0x10, ..итд } |
|
смысл? int[16] займет памяти больше char[16]...
|
|
|
|
08.12.2010, 16:25
|
#10
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Как сделать битовый массив в codevision
Сообщение от realid
|
Нужно if ((masiv_bit_int & mask_bit_int[nomer_bita_int])›0)
|
спасибо, исправил... ошибка копи-паст ))) забыл отредактить
Сообщение от code-by
|
смысл? int[16] займет памяти больше char[16]...
|
Уважаемый... тут вы не вьехали...masк_bit_int = это массив маск битов во FLASH, а не сам массив битов в RAM. Он будет ОДИН и тот же, для всех массивов битов в РАМе, сколько бы их не организовали.
А размер каждого битового массива masiv_bit_int, в RAMе будет занимать один INT=2 байта=16 бит.. и адресоваться он будет по номеру в переменой nomer_bita_int. Что и требовалось автору.
А дополнительные 32 байт во FLASH это мелочи.
А размер, смотрите что меньше скомпилит ваш компилятор. Сдвиг в цикле или обращение через массив масок.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 08.12.2010 в 16:37.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:33.
|
|