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