Перейти к содержанию

Преобразование массива в код (Си)


-=FISHER=-

Рекомендуемые сообщения

Всех приветствую!

Есть задача, в зависимости от значений элементов массива (всего 8 элементов), заполнить переменную типа char ноликами и единицами. Если точнее, перебираем весь массив, если в элементе trig будет 1, значит в переменную code на место бита под номером i записываем 1, если 0 то ничего не делаем. Я написал это так:

for (i=0; i=7; i++)
{
  if(trig[i]==1){code|=(1<<i);}
}

У меня есть подозрения что это неверная запись. Подправьте меня пожалуйста если это так. 

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только вот это (1 <<  i) работает достаточно медленно и порождает достаточно большой код. Я бы дополнил в целях оптимизации так:

code = 0;
uint8_t mask = 1;
for (i = 0;  i < 8; i++)
{
  if(trig[i] == 1){ code |= mask; }
  mask <<= 1;
}

 

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

Ссылка на комментарий
Поделиться на другие сайты

14 минуты назад, ARV сказал:

в целях оптимизации

Ну, если полируем код, тогда можно обойтись и без вспомогательной маски

code = 0;
for(i = 0; i < 8; i++)
{
if(trig[i] == 1) code |= 0x80;
code >>= 1;
}


 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Yurkin2015 сказал:

code = 0;
for (i = 0;  i < 8; i++)
{
  if(trig[i] == 1){ code |= (1 << i); }
}

 

Это опечатка..то что =7, должно быть ==7. А в остальном всё правильно?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Только что, Yurkin2015 сказал:

не понял, что это?

У меня написано так for (i=0; i=7; i++) , а должно было быть вот так for (i=0; i==7; i++) :)

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

:thank_you2:ОК

7 минут назад, Yurkin2015 сказал:

Не, должно быть вот так:

for (i = 0;  i < 8; i++) 

:thank_you2:ОК

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Yurkin2015 сказал:

И, это, зануляйте перед циклом обязательно

code = 0;

Договорились:yes:

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Yurkin2015 сказал:

Ну, если полируем код, тогда можно обойтись и без вспомогательной маски


code = 0;
for(i = 0; i < 8; i++)
{
if(trig[i] == 1) code |= 0x80;
code >>= 1;
}


 

Я, конечно, дико извиняюсь, но если полировать слишком сильно, можно сточить все под ноль, как вы и сделали. Что там у вас на выходе в code будет? ;)

Изменено пользователем ARV

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

Ссылка на комментарий
Поделиться на другие сайты

17 часов назад, ARV сказал:

Я бы дополнил в целях оптимизации так:

Смотря что оптимизировать. Если по скорости исполнения, то лучше будет так :

code=0;
if(trig[0] == 1) code |= (1<<0);
if(trig[1] == 1) code |= (1<<1);
if(trig[2] == 1) code |= (1<<2);
if(trig[3] == 1) code |= (1<<3);
...........

:D

Или табличкой - будет как ракета. Не, не получится тут никак таблицу применять. Поторопился с ответом, с просони...

Ссылка на комментарий
Поделиться на другие сайты

 

Now this looks like a job for me 
So everybody just follow me 
Cuz we need a little controversy, 
Cuz it feels so empty without me 

                                        Eminem

code = 0;
for(int i = 0; i < 8; i++)
{
code <<= 1;
code |= (trig == 1);
}

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

code |= (trig == 1);

Ох уж мне эти сишные изыски... сам я не большой любитель подобного, но раз пошла такая пьянка, тогда так ваще красивенько:

code |= !!trig[i];

 

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

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, ARV сказал:

Ох уж мне эти сишные изыски... сам я не большой любитель подобного, но раз пошла такая пьянка, тогда так ваще красивенько:


code |= !!trig[i];

 

!!trig и

trig == 1; не одно и тоже,

если надо только единицу фильтровать не подойдет.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Кстати, в некоторых случаях (как в этом), при работе с массивами, можно увеличить скорость выполнения, применив указатель.

unsigned char *pTrig=trig;
code = 0;
for(unsigned char i = 0; i < 8; i++)
{
code <<= 1;
code |= (*trig++ == 1);
}

Такой код должен выполниться быстрее, чем такой :

code = 0;
for(unsigned char i = 0; i < 8; i++)
{
code <<= 1;
code |= (trig[i] == 1);
}

Естественно, речь идёт о всяческих 8-ми битниках, ущемлённых нормальным набором инструкций.

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, ruhi сказал:

если надо только единицу фильтровать не подойдет

Да я вангую: топикстартеру надо строковое бинарное представление числа в байт превратить :)

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

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ARV сказал:

Да я вангую:

ИМХО, ванговать действия человека, который пишет :

20 часов назад, -=FISHER=- сказал:

У меня есть подозрения что это неверная запись.

бессмысленно. Там может оказаться всё, что угодно :)

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Alex сказал:

бессмысленно. Там может оказаться всё, что угодно :)

12 минуты назад, ARV сказал:

топикстартеру надо строковое бинарное представление числа в байт превратить :)

Верно.

 

 

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, -=FISHER=- сказал:

Верно

Если сие верно, то тогда сие не верно в принципе:

4 часа назад, Alex сказал:

trig[i] == 1

потому как верно сие:

trig[i] == '1';

А все из-за того, что вопрос задан изначально не так, как стоит задача...

Изменено пользователем Alex

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

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, ARV сказал:

Если сие верно, то тогда сие не верно в принципе:

Есть массив из 8 элементов типа char, каждый элемент равен либо 1 либо 0. Так же есть переменная code типа char. Нужно сделать так чтобы из этого:

trig[8] = {1,0,0,1,1,0,1,1};

Получилось вот это:

code = 0b10011011;

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...