Автор |
Сообщение |
Сообщение создано: 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:
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 век - век повсеместной автоматизации. Главное - во благо всем людям.
|