УкраїнськаEnglishmRussian
Вхід/Новий
У темі немає нових постів

Функция READ_BIT


Автор Повідомлення
Повідомлення створено: 23. 08. 2011 [09:05]
emc2
Сергей Угрюмов
Автор теми
Зареєстрован(а) с: 15.10.2010
Повідомлення: 8
Добрый день.
Попытался создать функцию, проверяющую наличие установленного бита в слове. Вход: IN, BIT, Выход:OUT
Программа:
temp=in;
for(j=0;j<bit;j++)
{
temp=(temp>>1);
out=(temp&0x01);
}
Тестирование во вкладке Исполнить показывает, что работает неправильно.
Что написано неправильно? Казалось бы элементарная программа.
Повідомлення створено: 23. 08. 2011 [13:10]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
Если bit - маска, то просто:
out=in&bit;

Если bit - номер бита (от 0 и старше), то тоже просто:
out=in&pow(2,bit);

PS in и bit - вход, целые, out - выход, логический. К тому же, переменные должны называться одинаково в списке и в теле программы.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 23. 08. 2011 [16:31]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"emc2" wrote:

JAVASCRIPT
temp=in;
for(j=0;j<bit;j++)
{
temp=(temp>>1);
out=(temp&0x01);
}
Тестирование во вкладке Исполнить показывает, что работает неправильно.
Что написано неправильно?

А что тут вообще правильно? Данная функция ни разу не должна выполнять поставленную задачу, хотя бы потому, что должно быть прерывание цикла по обнаружению установленного бита, а в данном случае в out всегда будет значение последнего бита (bit) переменной "in", что можно сделать и без цикла.

Learn, learn and learn better than work, work and work.
Повідомлення створено: 23. 08. 2011 [16:42]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"almaz" wrote:

Если bit - номер бита (от 0 и старше), то тоже просто:
out=in&pow(2,bit);

Сдвиг в лево это и есть степень основания системы исчисления.
Поэтому всегда принято и эффективнее: out=in&(1<<bit);

Learn, learn and learn better than work, work and work.
Повідомлення створено: 24. 08. 2011 [11:10]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
И ещё можно так: out=1&(in>>bit);

Гораздо эффективнее использовать битовые маски при разборе слова на биты, не выделяя данный участок в отдельную функцию:
out0=in&1;
out1=in&2;
out2=in&4;
...
out15=in&32768;

PS А исходная программа вполне работающая, просто в списке переменных в названиях использованы прописные символы, а в теле программы - строчные.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.
Повідомлення створено: 24. 08. 2011 [14:06]
emc2
Сергей Угрюмов
Автор теми
Зареєстрован(а) с: 15.10.2010
Повідомлення: 8
Спасибо за помощь. Так работает :). А имеются ли какие-нибудь средства отладки кода на java? Чтобы просматривать состояние временных переменных и пошагово отлаживать?
Повідомлення створено: 24. 08. 2011 [15:23]
almaz
Almaz Karimov
Contributor
Зареєстрован(а) с: 25.09.2008
Повідомлення: 516
Отлаживать можно введением временных отладочных переменных, сохраняющих в нужный момент интересующие значения до завершения программы и доступные для просмотра после завершения программы. Также можно выводить на печать (терминал) интересующие значения прямо во время выполнения программы. Такие способы отладки доступны в любых языках высокого уровня.

В первом случае в списке переменных ява-программы вводятся дополнительные переменные соответствующего типа (выход или возврат), которым в нужном участке ява-программы присваиваются интересующие значения. Можно суммировать (собирать) несколько (множество) значений в текстовую переменную.
Во-втором случае скаду нужно запустить из терминала linux и выводить на печать интересующие переменные из ява-программы средствами командной строки (echo):
http://wiki.oscada.org/Doc/FLibSYS?v=9gu#h378-4
Также при запуске скады из терминала в нём отображаются ошибки и много другой информации.

21 век - век повсеместной автоматизации. Главное - во благо всем людям.



12561