реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Помогите с алгоритмом!, проверка элементов массива на кратность 2^k
Gabe
сообщение May 27 2009, 13:30
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Помогите с алгоритмом, пожалуйста!
Нужно организовать проверку элементов массива на кратность 2^k, где k=1...4 unsure.gif

Делаю на ассемблере

Сообщение отредактировал Gabe - May 27 2009, 13:31
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 27 2009, 13:43
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Gabe @ May 27 2009, 16:30) *
Нужно организовать проверку элементов массива на кратность 2^k, где k=1...4
проверить на равенство нулю k младших битов. маски 0b00001111, 0b00000111, 0b00000011, 0b00000001 можно хранить во флеше и извлекать командой LPM.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 27 2009, 13:47
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Огромное спасибо!!!
Осталось только в документации мультикора разобраться с маской...
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 27 2009, 16:08
Сообщение #4





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Цитата
DO 8, endfor
MOVE (A0)+, R2 /* загружаем элемент массива a */
MOVE 0, R0
MOVE 0, R6
MOVE 3, R4 /* пусть к=3 */
DO R4, endfor1
BTSTL R0,R2 /* проверяем биты элемента */
INCL.eq R6,R6 /* если бит=0, то R6++ */
endfor1:
INC R0,R0 /* берём номер следующего бита*/
CMPL 2,R6 /* все ли три бита равны 0?*/
endfor:
MOVE.eq R2,(A1)+ /* если все, то переписываем элемент в b*/
STOP


Почему-то не работает вот этот инкремент: INCL.eq R6,R6 /* если бит=0, то R6++ */
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 27 2009, 16:27
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Молодой человек, зачем Вы вообще в ассемблер сунулись? Какую-такую супероптимальную программу Вы сможете написать? Надо бы для начала вопрос сформулировать, а перед формулировкой самому крепко подумать. И вот почему:

Условию, что число v кратно 2 и 4 и 8 и 16 равноценно условие, что v кратно 16 и проверяется так
Код
if ((v&0x0F)==0)
{
  //Число кратно 2 и 4 и 8 и 16
}


Если же в условии не "и", а "или", то это равноценно проверке на четность. Т.е.
Код
if ((v&0x01)==0)
{
  //Число кратно 2 или 4 или 8 или 16
}


На ассемблер нужного вам камня сами переведете?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 27 2009, 16:32
Сообщение #6





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



мне необходимо её написать на ассемблере, так как задача учебная...
скажем k=3, тогда надо проверять на кратность 8, что я в коде и делаю, побитово проверяя загруженное число
проблема в том, что признак бита почему-то не используется следующей командой

Сообщение отредактировал Gabe - May 27 2009, 16:34
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 27 2009, 16:42
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
мне необходимо её написать на ассемблере, так как задача учебная...


Это вторично.

Цитата
скажем k=3, тогда надо проверять на кратность 8, что я в коде и делаю


Хорошо, видя Ваш код мы догадаемся, что у Вас есть элемент массива v, и переменная k, которая определяет маску. Но это же, черт возьми, никак не следует из Вашего первоначального вопроса. Не говоря уже о том, что тип камня надо было бы упомянуть сразу.

По коду.

2^k=1<<k. Это понятно? Если не понятно, то 1<<k обозначает 1 сдвинутая влево на k бит.

Как из 1<<k изготовить маску? Правильно, (1<<k)-1.

Как проверить? Да просто сделать v&((1<<k)-1) и сравнить с 0. Точнее, после AND флаг Z будет установлен или сброшен.

Ищите в мануале на процессор, как сделать сдвиг влево по значению регистра, как вычесть 1, и как сделать AND.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 27 2009, 17:40
Сообщение #8





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



не ругайтесь, пожалуйста, я только начинающий, поэтому и ничего не написал.
вы правильно догадались насчёт условия задачи. а камень - это 1892ВМ3T (MC-12 от ЭЛВИС).
Rst7, большое Вам спасибо за помощь, буду делать

всё работает smile.gif
всем огромное спасибо за помощь!

кстати, возникает тогда такой вопрос: в случае кратности числу 2^k маска формируется таким образом (1<<k)-1. А если стоит задача просто найти элементы, кратные k? Какой алгоритм поиска стоит применить именно в такой ситуации?
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 28 2009, 03:57
Сообщение #9





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



С элементами, кратными 2,4,8 понятно. Как найти числа, кратные 3 и 7?
не могу найти соответствующие признаки...
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 28 2009, 04:01
Сообщение #10


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Проще всего будет банально разделить и проверить остаток. В камне наверняка есть комманда деления.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 28 2009, 04:20
Сообщение #11





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Банально разделить можно только в RISC-ядре, там есть соответствующая команда DIV, а в DSP-ядре (в котором надо сделать) такой команды и даже похожей на неё нет.
В инете есть ссылка на статью некоего Сулейманова Р.Р. http://www.zabspu.ru/artix/aview.php?aid=257 , но вот скачать её нигде не удаётся...

Подсказали идею просто вычитать из числа 3 (или 7), пока оно не станет равно 0 (кратно) или меньше нуля (не кратно). Мясо, конечно, при больших числах...

Сообщение отредактировал Gabe - May 28 2009, 05:04
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 28 2009, 05:09
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Gabe @ May 28 2009, 07:20) *
Подсказали идею просто вычитать из числа 3 (или 7), пока оно не станет равно 0 (кратно) или меньше нуля (не кратно). Мясо, конечно, при больших числах...
Возможно, Вам подойдут идеи из книги Генри Уоррен "Арифметические трюки для программистов". В книге есть глава "Целочисленное деление", в которой приведены алгоритмы определения частного и остатка при делении на 3 и 7. Книга "гуляет" в интернете (сам когда-то её скачал).
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 28 2009, 05:13
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Напишите деление в столбик самостоятельно. Тем более, что частное не интересует, только остаток.

Цитата
в которой приведены алгоритмы определения частного и остатка при делении на 3 и 7


Путем умножения на 1/х. Это не годится в случае произвольного x, а что-то мне подсказывает, что следующей стадией будет именно это smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 28 2009, 05:14
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Gabe @ May 28 2009, 07:20) *
Подсказали идею просто вычитать из числа 3 (или 7), пока оно не станет равно 0 (кратно) или меньше нуля (не кратно). Мясо, конечно, при больших числах...
При больших числах можно вычитать вначале большие числа кратные 3 (или 7). Например: 30, или 3333, или 9999, или 21615...
Go to the top of the page
 
+Quote Post
Gabe
сообщение May 28 2009, 09:48
Сообщение #15





Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629



Rst7, новых итераций не будетsmile.gif
Палыч, спасибо, будем изучать...

Вот попробовал реализовать идею с вычитанием... Алгоритм на бумаге вполне работает, а в MC2 Studio Jump'ы не дают нормально работать циклам.
Прикрепленный файл  DSP.rar ( 347.92 килобайт ) Кол-во скачиваний: 80
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 15:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.02062 секунд с 7
ELECTRONIX ©2004-2016