|
Помогите с алгоритмом!, проверка элементов массива на кратность 2^k |
|
|
|
May 27 2009, 13:30
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
Помогите с алгоритмом, пожалуйста! Нужно организовать проверку элементов массива на кратность 2^k, где k=1...4 unsure.gif
Делаю на ассемблере
Сообщение отредактировал Gabe - May 27 2009, 13:31
|
|
|
|
|
May 27 2009, 13:47
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
Огромное спасибо!!! Осталось только в документации мультикора разобраться с маской...
|
|
|
|
|
May 27 2009, 16:08
|
Группа: Новичок
Сообщений: 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++ */
|
|
|
|
|
May 27 2009, 16:27
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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 } На ассемблер нужного вам камня сами переведете?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 27 2009, 16:32
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
мне необходимо её написать на ассемблере, так как задача учебная... скажем k=3, тогда надо проверять на кратность 8, что я в коде и делаю, побитово проверяя загруженное число проблема в том, что признак бита почему-то не используется следующей командой
Сообщение отредактировал Gabe - May 27 2009, 16:34
|
|
|
|
|
May 27 2009, 16:42
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 27 2009, 17:40
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
не ругайтесь, пожалуйста, я только начинающий, поэтому и ничего не написал. вы правильно догадались насчёт условия задачи. а камень - это 1892ВМ3T (MC-12 от ЭЛВИС). Rst7, большое Вам спасибо за помощь, буду делать всё работает всем огромное спасибо за помощь! кстати, возникает тогда такой вопрос: в случае кратности числу 2^k маска формируется таким образом (1<<k)-1. А если стоит задача просто найти элементы, кратные k? Какой алгоритм поиска стоит применить именно в такой ситуации?
|
|
|
|
|
May 28 2009, 03:57
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
С элементами, кратными 2,4,8 понятно. Как найти числа, кратные 3 и 7? не могу найти соответствующие признаки...
|
|
|
|
|
May 28 2009, 04:20
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 28 2009, 09:48
|
Группа: Новичок
Сообщений: 10
Регистрация: 27-05-09
Пользователь №: 49 629

|
Rst7, новых итераций не будет  Палыч, спасибо, будем изучать... Вот попробовал реализовать идею с вычитанием... Алгоритм на бумаге вполне работает, а в MC2 Studio Jump'ы не дают нормально работать циклам.
DSP.rar ( 347.92 килобайт )
Кол-во скачиваний: 80
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|