Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Смысловое значение кода программы


Автор: shinoby 26.11.2011, 17:59
Попросили нарисовать блок-схемы для программы предназначенной для прибора, однако столкнулся с проблемой понимания нескольких строчек кода. Надеюсь вы мне поможете понять, что они означают (могут означать).

1-ая:   s=s>>1

2-ая: PORTB=PORTB|s  или PORTB=des|s   (что дает вертикальная линия?)

Автор: Twelves 26.11.2011, 19:04
1) Это побитовый сдвиг влево. все биты числа сдвигаются в данном случае на один влево, при этом младший теряется.
т.е если у тебя есть число 7 и ты напишешь 7 >> 1, то у тебя получится число 3 (семь в двоичном представлении 111 - сдвигаем, получаем - 011)

2) Одна | вертикальная черта - это побитовое ИЛИ. К соответствующим битам двух чисел применяется операция ИЛИ. и получается результат.
например: результат 4 | 2 это 6 (100 | 10 = 110)

Автор: shinoby 26.11.2011, 23:31
Цитата(Twelves @ 26.11.2011,  19:04)
1) Это побитовый сдвиг влево. все биты числа сдвигаются в данном случае на один влево, при этом младший теряется.
т.е если у тебя есть число 7 и ты напишешь 7 >> 1, то у тебя получится число 3 (семь в двоичном представлении 111 - сдвигаем, получаем - 011)

2) Одна | вертикальная черта - это побитовое ИЛИ. К соответствующим битам двух чисел применяется операция ИЛИ. и получается результат.
например: результат 4 | 2 это 6 (100 | 10 = 110)

В принципе я тоже так предполагал, единственное, что меня смущало, да и сейчас смущает это то, что я вижу замкнутый цикл из которого нет выхода.
Ниже привожу отрывок кода:
Код

if (nakop<=255){
PORTD.5=1;}
else {
stop:PORTD.5=0;
nakop=0;
PORTA=0;
ed=9;
des=9;
sot=9;
tis=9;
PORTB=ed;
s=0b10000000;
PORTB=PORTB|s;
delay_ms(1);
if (s!=0b00010000)
{s=s>>1;
PORTB=des|s;
delay_ms(1);
s=s>>1;
PORTB=sot|s;
delay_ms(1);
s=s>>1;
PORTB=tis|s;
delay_ms(1);
s=s>>1;
}
goto stop;}


Автор: Dem_max 27.11.2011, 05:48
ну а почему он не может быть ?

Автор: drug007 28.11.2011, 07:02
Дело в том, что речь идет о программе для встроенного устройства, которое работает без какой-либо ОС. Грубо говоря, когда включается устройство, сразу начинает работать данная программа, без загрузки какого-либо другого софта. Если не будет постоянного цикла, то программа выполнится один раз и прибор перестанет работать. А в цикле он будет работать пока вы его не выключите. А так как программа единолично распоряжается работой прибора, ей не надо согласовывать свою работу с другими программами, поэтому цикл без выхода простое и даже элегантное решение. Это обычная организация выполнения кода во встраиваемых(embedded) приложениях.

Автор: fish9370 28.11.2011, 10:35
Цитата(shinoby @  26.11.2011,  17:59 Найти цитируемый пост)
1-ая:   s=s>>1

Цитата(Twelves @  26.11.2011,  19:04 Найти цитируемый пост)
Это побитовый сдвиг влево


вобще-то это сдвиг вправо  smile 

а прогу писал извращенец

Автор: Twelves 28.11.2011, 12:04
Цитата(fish9370 @ 28.11.2011,  10:35)
Цитата(shinoby @  26.11.2011,  17:59 Найти цитируемый пост)
1-ая:   s=s>>1

Цитата(Twelves @  26.11.2011,  19:04 Найти цитируемый пост)
Это побитовый сдвиг влево


вобще-то это сдвиг вправо  smile 

а прогу писал извращенец

оу.  smile  описАлся, имел в виду именно вправо 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)