Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как последовательно вытаскивать биты из массива?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
777777
Код
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)

sigmaN
Цитата
Если первый байт(к примеру) равен 1 и следующий бит равен 1, то...,но как может быть байт равен единице,там же 8 битов
ну так операция & же, а ещё сдвиг 1 влево на j бит (1 << j).
Дальше сами....
По Вашему посту видно, что Вы абсолютно не поняли смысл этого
Код
if (mass[i] & (1 << j))


Цитата
Я уж не говорю о том, что многоразрядные сдвиги в AVR отсутствуют и потому выражения типа 1<<j кодируются крайне неэффективно.
Тогда что же, 8 раз & с заранее заготовленными масками?
типа if( mass[j] & masks[j] ).. правда 8 байт памяти коту под хвост...
а на асме что-то типа test bit есть? а интринсик? может вообще тогда можно красиво сделать..
777777
Цитата(sigmaN @ Jan 24 2011, 08:58) *
Тогда что же, 8 раз & с заранее заготовленными масками?
типа if( mass[j] & masks[j] ).. правда 8 байт памяти коту под хвост...
а на асме что-то типа test bit есть? а интринсик? может вообще тогда можно красиво сделать..

Вот-вот, я же говорю: мозг паскалиста безнадежно изуродован...

Будь моя воля, я бы запретил законом преподавание программирования по паскалю
sigmaN
Ггг)) ну да
Цитата
for (j = 1; j != 0; j <<= 1) {
if (mass[i] & j)
мега16
Да я паскаль вообще не знаю,вообще я охриненно начинающий любитель,никто мне не преподавал ничего,вот сижу и учусь в свободное время,это же не запрещается.
мега16
Ну так-можно ли вытаскивать байты в одном цикле for ?
_Pasha
Имхо, в недалеком будущем появится обилие тем типа "как присвоить значение 8-ми битной переменной" с последующим флеймом на 200 страниц. Нас почти 50штук (тысяч ГГ), давайте будем людьми, потому что уже стыдно перед более интеллектуальными амебами и инфузориями.
777777
Цитата(мега16 @ Jan 24 2011, 10:57) *
Ну так-можно ли вытаскивать байты в одном цикле for ?

Байты в одном, биты - во вложенном в него.
GetSmart
Это же ветка для начинающих. И Паскаль неплохой язык. Уймитесь, люди.
OlegNZH
У меня была проблема в другом-сдвигать сдвигать цепочку в 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 sm.gif
#include <shift.asm>
#include <shift.asm>
........
777777
Цитата(GetSmart @ Jan 24 2011, 11:46) *
Это же ветка для начинающих.

Поэтому им и дают советы
Цитата(GetSmart @ Jan 24 2011, 11:46) *
И Паскаль неплохой язык. Уймитесь, люди.

Только программистов приучает к дубовости и неповоротливости мышления и в результате им даже в голову не может прийти, что переменная цикла совсем не обязательно должна увеличиваться от нуля до N, а может делать что угодно, вплоть до того, что ее вообще может не быть.
OlegNZH
Это не с Паскаля начинается , с Basic-ка. sm.gif
GetSmart
Цитата(777777 @ Jan 24 2011, 18:11) *
Поэтому им и дают советы

Без ваших советов процесс шёл бы гораздо продуктивнее.
Зайдите ещё в детский садик и всем детишкам в глазки твердите что они тупые. Ну и советуйте в своём духе.
AHTOXA
Цитата(777777 @ Jan 24 2011, 18:11) *
Только программистов приучает к дубовости и неповоротливости мышления и в результате им даже в голову не может прийти, что переменная цикла совсем не обязательно должна увеличиваться от нуля до N

Да успокойтесь уже. Все уже поняли, что вы -- Настоящий Разработчик, вы умеете ставить резистор последовательно со светодиодами, знаете, как надо развести АЦП, чтоб не требовалась фильтрация, и пишете на Си.
А то, что критикуемого вами паскаля вы не знаете, и конструктива в ваших сообщениях - кот наплакал, -- это ничего, главное что вы побуждаете начинающих расти, не даёте им сбиться с пути. Продолжайте в том же духе, я мысленно вам аплодирую.
demiurg_spb
Настала пора инквизиции? :-)
Цитата
Товарищ Сталин был большой любитель кино.
И лично смотрел каждый новый фильм перед тем как пустить фильм в прокат. Однажды ему показывают новую картину про то как на одной из совецких строек орудовал шпион-диверсант... Сталин посмотрел кино и говорит: "С точки зрения идеологии фильм не выдерживает критики... поэтому надо расстрелять режиссера, сценариста, всех актеров, занятых в съемке, всю массовку и весь киноперсонал..." Главный режиссер с бледным как простыня лицом: "Товарищ Сталин, может быть внести изменения в сценарий??? Допустим, шпион проникается духом совецких рабочих, перевоспитывается и становится передовиком???"
Сталин подумал, затянулся трубкой и говорит: "... ну или так..."

Кто за то чтобы расстрелять 7777777 на месте?
OlegNZH
...
Кен Томпсон признал следующее - затем Деннис и Брайан разработали по-настоящему извращенный диалект Паскаля, назвав его "A". Когда мы обнаружили, что другие действительно пытаются писать программы на A, мы быстро добавили еще парочку хитрых примочек, создав B, BCPL, и, наконец, Си. Мы остановились, добившись успешной компиляции следующего:

for(;P("\n"),R-;P("|"))for(e=C;e-;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
...
sad.gif
PS.Шютка здесь http://www.fssr.ru/hz.php?name=News&fi...le&sid=1043
777777
Цитата(AHTOXA @ Jan 24 2011, 19:36) *
Да успокойтесь уже. Все уже поняли, что вы -- Настоящий Разработчик, вы умеете ставить резистор последовательно со светодиодами, знаете, как надо развести АЦП, чтоб не требовалась фильтрация, и пишете на Си.
А то, что критикуемого вами паскаля вы не знаете, и конструктива в ваших сообщениях - кот наплакал, -- это ничего, главное что вы побуждаете начинающих расти, не даёте им сбиться с пути. Продолжайте в том же духе, я мысленно вам аплодирую.

Что с вами? У вас butthurt? Вы паскалист и шокированы, что на Си можно написать
Код
for (j = 1; j != 0; j <<= 1) {
    if (mass[i] & j)

Я могу только посочувствовать...
GetSmart
Цитата(777777 @ Jan 24 2011, 22:27) *
Я могу только посочувствовать...

Себе посочувствуйте..
Паскаль придумал Профессионал с большой буквы в 100! раз продвинутее вас. Идите нервно курить в сторонке sm.gif
Кстати, когда Паскаль был придуман, никакого Си не существовало в помине.
AHTOXA
Цитата(777777 @ Jan 24 2011, 22:27) *
Я могу только посочувствовать...

И это говорит человек, который не знает, что такое 1l в записи (1l<<15)? biggrin.gif
Сочувствие здесь из нас двоих как раз вызываете вы. Видно, что человек нахватался понемногу отовсюду, и сразу же возомнил себя крутым спецом. От этого и чрезмерная категоричность суждений, и неадекватные оценки, и поспешные выводы.
Надеюсь, что это временно, и когда-нибудь вы поймёте, как глупо себя вели.

И да, просто JFYI: циклы в паскале не обязательно начинаются с нуля. Кроме того, битовой маске совершенно не обязательно быть переменной цикла:
Код
var j, k : byte;
begin
  j := 1;
  for k := 1 to 8 do
  begin
    if mass[i] and j then do_something;
    j := j shl 1;
  end;
end;
_Pasha
Цитата(777777 @ Jan 24 2011, 16:11) *
Только программистов приучает к дубовости и неповоротливости мышления и в результате им даже в голову не может прийти, что переменная цикла совсем не обязательно должна увеличиваться от нуля до N, а может делать что угодно, вплоть до того, что ее вообще может не быть.

Значит, Вы не знаете Паскаля. Кстати, это уже не первый раз.
Ойц, мона было уже и не лезть.
777777
Цитата(AHTOXA @ Jan 24 2011, 20:44) *
И это говорит человек, который не знает, что такое 1l в записи (1l<<15)? biggrin.gif

Да, представь себе, я в таких случаях пишу 1L чтобы те, кто будут читать мою программу, не спутали ее с вертикальной чертой и не думали, что означает этот синтаксис. Мелочь, конечно, но...

Цитата(AHTOXA @ Jan 24 2011, 20:44) *
И да, просто JFYI: циклы в паскале не обязательно начинаются с нуля. Кроме того, битовой маске совершенно не обязательно быть переменной цикла:

Это называется "перевернуть с ног на голову". Си как раз тем и лучше паскаля, что там битовая маска может быть переменной цикла! А паскалю это недоступно - приходится водит еще одну абсолютно ненужную переменную.

Да, можете считать это чем угодно, но могу еще раз повторить: паскаль - ненавижу за его дубовость и неповоротливость и будь моя воля, я бы запретил изучение программирования по паскалю.
_Bill
Цитата(GetSmart @ Jan 24 2011, 21:43) *
Паскаль придумал Профессионал с большой буквы в 100! раз продвинутее вас. Идите нервно курить в сторонке sm.gif
Кстати, когда Паскаль был придуман, никакого Си не существовало в помине.

Ну, во-первых, Си придумали тоже отнюдь не дилетанты. Во-вторых, Паскаль и Си появились примерно в одно и то же время. И в-третьих, цели создания языков были разные. Если Паскаль был создан в целях обучения программированию, то Си - для упрощения создания системного программного обеспечения (ОС, компиляторов и т.д. и т.п.). Наконец, создатели обоих языков являлись профессионалами в своих областях. У каждого из языков есть свои достоинства и свои недостатки. Так что спорить тут не о чем. Или нет?
777777
Цитата(GetSmart @ Jan 24 2011, 20:43) *
Кстати, когда Паскаль был придуман, никакого Си не существовало в помине.

Алгол был придуман еще раньше - и что из этого? Только то, что паскаль оказался на помойке позже алгола.

Цитата(GetSmart @ Jan 24 2011, 20:43) *
Паскаль придумал Профессионал с большой буквы в 100! раз продвинутее вас. Идите нервно курить в сторонке sm.gif

Этот профессионал - типичный лузер, который, понимая, что K&R обошли его на порядок, тем не менее дергается и пытается что-то доказать, хотя постоянно остается догоняющим.
_Bill
Цитата(AHTOXA @ Jan 24 2011, 21:44) *
И это говорит человек, который не знает, что такое 1l в записи (1l<<15)? biggrin.gif
Сочувствие здесь из нас двоих как раз вызываете вы. Видно, что человек нахватался понемногу отовсюду, и сразу же возомнил себя крутым спецом. От этого и чрезмерная категоричность суждений, и неадекватные оценки, и поспешные выводы.
Надеюсь, что это временно, и когда-нибудь вы поймёте, как глупо себя вели.

И да, просто JFYI: циклы в паскале не обязательно начинаются с нуля. Кроме того, битовой маске совершенно не обязательно быть переменной цикла:
Код
var j, k : byte;
begin
  j := 1;
  for k := 1 to 8 do
  begin
    if mass[i] and j then do_something;
    j := j shl 1;
  end;
end;

А как данный код соотносится с выделением бита? Кстати, оператор shl в стандартном Паскале вообще отсутствовал.
777777
Цитата(_Bill @ Jan 25 2011, 08:54) *
Ну, во-первых, Си придумали тоже отнюдь не дилетанты.

Кто бы спорил.
Цитата(_Bill @ Jan 25 2011, 08:54) *
И в-третьих, цели создания языков были разные. Если Паскаль был создан в целях обучения программированию, то Си - для упрощения создания системного программного обеспечения (ОС, компиляторов и т.д. и т.п.).

Ошибаетесь. Поначалу это были конкурирующие языки с одним и тем же назначением. Но после того, как стало ясно, что паскаль сливает по всем параметрам, Вирт, чтобы не потерять рынок, начал заливать, что он, мол, с самого начала создавал его для обучения. На самом же деле для обучения он как раз и не подходит, так как отучает студета от гибкости, заталкивает его в узкие рамки и поэтому когда он переходит на Си, он просто не знает о том, что тех рамок уже нет, что можно сделать быстрее и проще.
Цитата(_Bill @ Jan 25 2011, 08:54) *
У каждого из языков есть свои достоинства и свои недостатки. Так что спорить тут не о чем. Или нет?

С таким же успехом можно доказываль, что у Мерседеса и Жигулей есть свои достоинства и свои недостатки и спорить тут не о чем.
AHTOXA
Цитата(777777 @ Jan 25 2011, 10:53) *
Мелочь, конечно, но...

Да-да, я в курсе. "Крутой Профессионал С Большой Буквы ™" lol.gif
Цитата
Это называется "перевернуть с ног на голову". Си как раз тем и лучше паскаля, что там битовая маска может быть переменной цикла! А паскалю это недоступно - приходится водит еще одну абсолютно ненужную переменную.

Это называется - "по теме (помочь новичку) было сказать нечего, зато умею ненавидеть паскаль". А ведь на самом деле непонимание было совершенно не связано с паскалем (как это потом явно подтвердил сам автор темы). Но вы продолжили поносить паскаль...
Цитата
Да, можете считать это чем угодно, но могу еще раз повторить: паскаль - ненавижу за его дубовость и неповоротливость и будь моя воля, я бы запретил изучение программирования по паскалю.
Вы уже показали, что не знакомы с предметом своей ненависти, зачем же продолжать позориться? Ведь с каждым вашим постом становится всё более очевидным, что вы поёте с чужих слов, в надежде показаться "Профессионалом С Большой Буквы". Поверьте, это тщетные старания, настоящего профессионала видно не по его крутым суждениям, а по его практическим знаниям. А этого у вас, увы, пока не замечено.

Цитата(_Bill @ Jan 25 2011, 10:54) *
Так что спорить тут не о чем. Или нет?

Вообще-то сравнение шло не "автор паскаля vs авторы си", а "777777 vs автор паскаля". Как думаете, кто более профессионален? sm.gif
777777
Цитата(AHTOXA @ Jan 25 2011, 09:08) *
Это называется - "по теме (помочь новичку) было сказать нечего

Нечего? То есть писать (1<<j) - это по-вашему нормально? Пусть компилятор генерирует цикл сдвигающий единицу, ничего страшного?


Цитата(AHTOXA @ Jan 25 2011, 09:10) *
Вообще-то сравнение шло не "автор паскаля vs авторы си", а "777777 vs автор паскаля". Как думаете, кто более профессионален? sm.gif

Вообще-то сравнение шло "паскаль" vs "си", а все осталное - ваши фантазии и попытки перехода на личности.
_Bill
Цитата(777777 @ Jan 25 2011, 10:07) *
Кто бы спорил.

Поначалу это были конкурирующие языки с одним и тем же назначением. Но после того, как стало ясно, что паскаль сливает по всем параметрам, Вирт, чтобы не потерять рынок, начал заливать, что он, мол, с самого начала создавал его для обучения. На самом же деле для обучения он как раз и не подходит, так как отучает студета от гибкости, заталкивает его в узкие рамки и поэтому когда он переходит на Си, он просто не знает о том, что тех рамок уже нет, что можно сделать быстрее и проще.

Совсем нет. Когда Вирт придумал Паскаль и стал его использовать в своей преподавательской деятельности, для языка и компилятора не существовало. Компилятор с Паскаля появился позже, когда возникла необходимость в реально работающих программах. Если говорить о целях, то Паскаль являлся сильно типизированным языком, со строгой проверкой типов. Это позволяло избегать двусмысленностей в конструкциях. Си же напротив, многое возлагал на самих программистов, изначально в Си отсутствовала проверка типов. При этом многие конструкции языка были ориентированы на упрощение кодирования и генерирования более эффективного кода.
PS: Интересно отметить, что первый компилятор с Паскаля появился на "больших" машинах типа CDC и IBM. А первый компилятор с Си был написан для мини-ЭВМ типа Interdata, PDP. Это тоже о многом говорит.
AHTOXA
Цитата(777777 @ Jan 25 2011, 11:14) *
Нечего? То есть писать (1<<j) - это по-вашему нормально? Пусть компилятор генерирует цикл сдвигающий единицу, ничего страшного?

Да, это нормально. Для начинающего вполне допустимо жертвовать производительностью в пользу наглядности. Сначала надо понять, как это работает вообще, а уже потом заниматься оптимизацией.
Цитата(777777 @ Jan 25 2011, 11:14) *
Вообще-то сравнение шло "паскаль" vs "си", а все осталное - ваши фантазии и попытки перехода на личности.
Вообще-то речь шла вот об этой цитате:
Цитата(GetSmart @ Jan 24 2011, 22:43) *
Себе посочувствуйте..
Паскаль придумал Профессионал с большой буквы в 100! раз продвинутее вас. Идите нервно курить в сторонке sm.gif

и в ней речь идёт именно о сравнении вас и автора паскаля.
GetSmart
Цитата(777777 @ Jan 25 2011, 11:14) *
Вообще-то сравнение шло "паскаль" vs "си", а все осталное - ваши фантазии и попытки перехода на личности.

Чтобы открыто критиковать, а точнее просто срать на Паскаль, нужно сперва придумать что-то сравнимо значимое. А то это похоже это на лай дворняжки. Лично вы - никто в сравнении с теми, кто придумывал и Паскаль, ну и Си в придачу.

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

Цитата(_Bill @ Jan 25 2011, 10:54) *
Так что спорить тут не о чем. Или нет?

Наш/мой спор ведь не об этом. Так что есть.
777777
Цитата(AHTOXA @ Jan 25 2011, 09:29) *
Вообще-то речь шла вот об этой цитате:

Жаль что это не моя цитата
Цитата(AHTOXA @ Jan 25 2011, 09:29) *
и в ней речь идёт именно о сравнении вас и автора паскаля.

Вот именно - речь идет о переходе на личности
AHTOXA
Цитата(777777 @ Jan 25 2011, 11:47) *
Жаль что это не моя цитата

Так и ответ был не вам. Вы хоть читайте внимательно что ли.
777777
Цитата(GetSmart @ Jan 25 2011, 09:45) *
Чтобы открыто критиковать, а точнее просто срать на Паскаль, нужно сперва придумать что-то сравнимо значимое.

Забавное суждение. Значит вы пользуетесь плохими инструментами, покупаете бракованные микросхемы и для разводки плат выбираете худшую программу потому что сами даже такого не можете сделать? Я-то стараюсь выбрать лучшее, даже когда сам не могу сделать и худшее.
Цитата(GetSmart @ Jan 25 2011, 09:45) *
А уж периодически читая чушь, которую вы пишете в других ветках мне захотелось хотя бы в этой ветке высказаться о вашем уровне суждений.

А надо было там, где эта "чушь" была. А сейчас это действительно выглядит как лай дворняжки.
GetSmart
Цитата(777777 @ Jan 25 2011, 11:56) *
А надо было там, где эта "чушь" была. А сейчас это действительно выглядит как лай дворняжки.

Всё нормально. Здесь она была самая большая.

Цитата(777777 @ Jan 25 2011, 11:56) *
Забавное суждение. Значит вы пользуетесь плохими инструментами,

Дальше этой дури читать смысла нет. С самого начала Паскаль активно использовался в обучении программированию. И тут приходит супер-мега-профи 777777 и говорит всем, что они недоумки. Если это мега-открытие, до которого не додумались тысячи-десятки/сотни людей, то за это полюбому надо вручить Нобеля biggrin.gif
_Pasha
Хрен с ним, с паскалем, лишь бы человек был хороший sm.gif
Насчет оптимизаций. Ну хватит делать ручную работу там, где можно автоматиццки. И на паскале конструкцию типа
Код
for j:= 0 to 7 do
begin
d := d or (1 shl j);
end;

компилер обязан привести в нормальный вид, и на сях подобные штучки оптимизируются за редким исключением. И все это поступательно движется в одном направлении: пока прграммеры тупеют, компиляторы умнеют. Шо сделаешь, диалектика.
sigmaN
Цитата
Код
(1 shl j)
компилер обязан привести в нормальный вид
на авр тоже? Ну не знаю...Мне кажется наоборот - не приведут в нормальный вид за редким исключением....
_Bill
Цитата(sigmaN @ Jan 25 2011, 22:15) *
на авр тоже? Ну не знаю...Мне кажется наоборот - не приведут в нормальный вид за редким исключением....

И на AVR тоже. Просто оператор shl в Паскале не является стандартным. Это - расширение.
_Pasha
Цитата(sigmaN @ Jan 25 2011, 22:15) *
на авр тоже? Ну не знаю...Мне кажется наоборот - не приведут в нормальный вид за редким исключением....

Причем тут целевая машина? Посмотрите, например, PMP pascal - очень прилично для пиков.
Есть где-то для армоводов - зачат, но до половой зрелости как до луны пешком.
Кстати, Керниган когда писал свое "за что я не люблю паскаль" - в основном говорил о негибком FOR, и о том, что внутри блока низзя объявлять переменные, ... а, ну и о том, что нет статических переменных.
Извините за кривой почерк оффтоп sm.gif
sigmaN
ну AVR я помянул именно от того, что как известно, умеет сдвигать за один такт на один бит, а тут получается надо сдвигать более чем на один бит. Т.е. будет иметь место вложенный цикл, реализующий сдвиг. Именно поэтому я немного усомнился в оптимальности такого решения.
_Pasha
Цитата(sigmaN @ Jan 26 2011, 12:54) *
а тут получается надо сдвигать более чем на один бит.

Все, я понял. Вы просто вырвали из приведенного контекста (1 shl j), в то время как я привел цикл, для того, чтобы сказать, что компилер увидит, что переменная цикла "монотонно" возрастает и в выражении сдвига кроме нее других переменных нету, и просто заменит на операцию сдвига на 1 разряд в каждой итерации цикла. Вот я и говорил, что в Winavr такое уже есть, по факту гуанокод оптимизировался именно так.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.