|
|
  |
Как последовательно вытаскивать биты из массива? |
|
|
|
Jan 9 2011, 16:35
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-12-10
Пользователь №: 61 893

|
Проблема решена уже.
|
|
|
|
|
Jan 24 2011, 05:20
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-12-10
Пользователь №: 61 893

|
Упростил так- Код void bits(){unsigned int i,j; for (i=0; i<32; i++) { for (j=0; j<8; j++) { if (mass[i] & (1 << j)) {DS = 1;} //записываем в линию данных else {DS = 0;} }}} Работать то работает, но хочется конкретно понять, а именно вот эту часть- Код if (mass[i] & (1 << j)) Если на словах сказать-получается так- Если первый байт(к примеру) равен 1 и следующий бит равен 1, то...,но как может быть байт равен единице,там же 8 битов. И вообще, можно ли вытащить биты без двух циклов, у меня там всегда 32 байта по 8 битов, так что можно так- Код for (i=0; i<256; i++) { или не можно? Я так по всякому пробовал-но не получается.
|
|
|
|
|
Jan 24 2011, 05:49
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Код code[i]&(1<<j))?1:0 Очень понравилось. Прям как типичный индусский код: Код if(x == true) return true; else return false; Я уж не говорю о том, что многоразрядные сдвиги в AVR отсутствуют и потому выражения типа 1<<j кодируются крайне неэффективно. Впрочем, для тех, кто начинал с Паскаля, это простительно, их мозг безнадежно изуродован Паскалем и им просто не может прийти в голову написать так: Код for (j = 1; j != 0; j <<= 1) { if (mass[i] & j)
Сообщение отредактировал 777777 - Jan 24 2011, 05:56
|
|
|
|
|
Jan 24 2011, 05:58
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Если первый байт(к примеру) равен 1 и следующий бит равен 1, то...,но как может быть байт равен единице,там же 8 битов ну так операция & же, а ещё сдвиг 1 влево на j бит (1 << j). Дальше сами.... По Вашему посту видно, что Вы абсолютно не поняли смысл этого Код if (mass[i] & (1 << j)) Цитата Я уж не говорю о том, что многоразрядные сдвиги в AVR отсутствуют и потому выражения типа 1<<j кодируются крайне неэффективно. Тогда что же, 8 раз & с заранее заготовленными масками? типа if( mass[j] & masks[j] ).. правда 8 байт памяти коту под хвост... а на асме что-то типа test bit есть? а интринсик? может вообще тогда можно красиво сделать..
--------------------
The truth is out there...
|
|
|
|
|
Jan 24 2011, 06:30
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-12-10
Пользователь №: 61 893

|
Да я паскаль вообще не знаю,вообще я охриненно начинающий любитель,никто мне не преподавал ничего,вот сижу и учусь в свободное время,это же не запрещается.
|
|
|
|
|
Jan 24 2011, 07:57
|
Участник

Группа: Участник
Сообщений: 43
Регистрация: 26-12-10
Пользователь №: 61 893

|
Ну так-можно ли вытаскивать байты в одном цикле for ?
|
|
|
|
|
Jan 24 2011, 09:45
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 19-11-08
Пользователь №: 41 782

|
У меня была проблема в другом-сдвигать сдвигать цепочку в 160 байт 4 строки (5000 диодов)! Тут каждый такт на счету, иначе даже на 16Мгц лажа. Пришлось ассм-вставку делать CODE #asm OUT 0x15,R19 ; выводим SBI 0x18,0 ; SBI 0x12,5 ; защелкиваем CBI 0x18,0 ; CBI 0x12,5 ; ROR R19 ; сдвигаем #endasm ,выделяя для данных весь порт (благо дофига свободных было)-сам вывод в PORTx.0, и потом 8 раз include  #include <shift.asm> #include <shift.asm> ........
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|