Просмотр полной версии : Сдвиг массива (не циклический)
Есть массив на 224 бит (хотя не суть важно). Так вот, хотелось бы идейку по поводу изящного поразрядного сдвига влево данного массива. Судьба бита, выходящего за старший разряд, неинтересна. Конечно, можно в лоб for to выполнить и побитно перенести. Но это долго, хотелось бы выиграть время на исполнение. Кому не жалко, поделитесь идеей). Думаю, такой сдвиг будет интересен не только мне.
Вопрос для чего сдвигать массив бит ? какая в этом сокральная идея ?
я к тому, что я понял бы чтобы на основании 1-ниц в массиве сформировать некий массив данных. но вот сдвиг для чего, расскажите.
делать сдвиг побайтно (по слову) с сохранением и переносом переходящего бита в следующий байт или слово. (ROR, ROL, можно SHR, SHL так как один бит все равно сохранять и переносить. Ну и все равно цикл, только уже для байт (слов)
мелкий как всегда чудит, не разобравшись, массив бит в КДС можно сразу представлять как массив байт, ни какие битовые сдвиги не помогут,тем более rol,ror.
указатели или бибка syslibmem могут сделать задуманное одной строкой, либо отказаться от массива и "поколдовать" со смещениями
Идея такая. Есть машина, в которой очень навороченная (в плане обилия шестерёнок) трасмиссия. Эта вся груда металла приводит в движениие (синхронно) кучу барабанов. И на входе этой машины контролируется наличие некого продукта, который дальше порционно движется по барабанам. В нужный момент, если есть на входе машины исходный продукт и он подошёл барабанам в то место, где ожидается, включается подача всяких комплектующих, выключается продувка барабанов и т.п. Можно было обойтись счётчиками, но у меня идея такова, чтобы ловить эхосигнал (отклик от продукта на входе) по синхроимпульсу (от датчика на трасмиссии). Т.е. эхо либо есть, либо нет на каждый синхроимпульс. Далее весь массив сдвигается. И каждое последующее устройство, которое контролирует определённый бит в массиве, вкл/выкл.подачу ингридиента в момент обнаружения/отсутствия эхосигнала в контролируемом разряде. Сдвиг массива происходит по сигналу от датчика трагсмиссии, на один шаг при перемещении продукта по барабанам на один шаг.
Такая вот ситуёвина. Изначально я представил массив как 7 регистров DWORD (т.е. массива как такового не было, была его замена на семь регистров) и их двигал, перенося биты старшего разряда предыдущих регистров в биты младших разрядов последующих регистров. А регистры сдвигал влево при этом. Далее был гемморой по выдёргиванию из этой семёрки регистров по номеру позиции нужного бита. Так-то получилось, но реализация громоздкая. Потому и обратился за помощью к знатокам. Рассмотрю все предложения). К сожалению, сам массив не двинуть. В инете смотрел, как народ на сях двигает массив. Многие тупо предлагают побитно переносить из предыдущего в последующий разряд. В общем тоже не быстрая реализация.
Есть ещё стек fifo
Со стеком разве получится? Там first in - first out говорит за себя. Честно говоря, пока не понял, как это применить можно было бы.
capzap и? я так понял надо аналог SHL (раз старший разряд переносился в младший следующего а самый последний никому не нужен) но не для 32 бит (DWORD) а для всех 224 бит.
Есть такая команда в CDS где нибудь ? И полагаю в sislibmem будет все то же самое, что написать самому, нет ?
Как это сделать без sislibmem, да просто. в цикл загнать все dword а внутри делать SHL над каждым, запоминая старший разряд и в нужное время копировать его в следующий dword.
Если есть для CDS готовое решение над массивом бит, неплохо было бы его увидеть. Цель топика то в этом как раз.
Владимир Ситников
27.07.2017, 10:07
Далее весь массив сдвигается.
melky верно спрашивает:
Вопрос для чего сдвигать массив бит ? какая в этом сокральная идея ?
Сдвигать-то вообще нужно?
Может оказаться, что достаточно изменить точку остчёта, а все биты путь остаются на своих местах
melky верно спрашивает:
Сдвигать-то вообще нужно?
Может оказаться, что достаточно изменить точку остчёта, а все биты путь остаются на своих местах
Сдвиг удобен для меня. Можно было бы кругу писать в массив, а потом, используя счётчик, как указатель текущего шага, извлекать нужные биты. Такое я трже рассматривал, но что-то у меня вышло путного. Зацепился я за идею со сдвигом, вроде всё очевидно, двигай, да читай с одних и тех же позиций (позиции разных контролирующих устройств разные, естественно).
ну так оно понятно. Есть dword1, dword2 и т.д.
Есть устройства У1, У2 и т.д.
dword1.4 - У1; dword2.3 - У2 , если 0 одни действия, если 1 другие действия и так со всеми устройствами.
Тогда наверное удобно, что-то вроде конвейера для исполнительных механизмов.
ну так оно понятно. Есть dword1, dword2 и т.д.
Есть устройства У1, У2 и т.д.
dword1.4 - У1; dword2.3 - У2 , если 0 одни действия, если 1 другие действия и так со всеми устройствами.
Тогда наверное удобно, что-то вроде конвейера для исполнительных механизмов.
Ну да, именно так. Чтобы не лепить кучу датчиков на машину (тем более, что негде). Такой вот позиционер импровизированный получается
Ну тогда посмотреть готовые решения в CDS, может в oscat что есть или как capzap пишет в syslibmem глянуть. если нет, то написать самому.
Со стеком разве получится? Там first in - first out говорит за себя. Честно говоря, пока не понял, как это применить можно было бы.
загляните в оскат, посмотрите как выглядит реализация стека, как раз по массиву гулет начальная и конечная точки, соответственно нужный Вам индекс лежит по адресу начальная точка плюс номер нужного элемента и все это по модулю массива. Но если нне заморачиваться то создать указатель на массив начиная с второго элемента коллекции и присвоить его указателю начиная с первой позиции, если не получиться то через буфферный массив, то же самое реализовано и в syslibmem
Понял, буду смотреть. Спасибо за наводки.
просто гулять по массиву наверное не корректно, если особенно в нем могут по другим условиям меняться биты, мы же всей картины не знаем.
просто гулять по массиву наверное не корректно, если особенно в нем могут по другим условиям меняться биты, мы же всей картины не знаем.
Условие, которое определяет значение бита, лишь одно - отсутствие или наличие эхосигнала от продукта на входе в машину на каждом шагу. Есть продукт - единица, машина провернула барабаны на угол, а программа либо сдвинула буфер, либо сменила позицию записи и снова контроль эхосигнала и т.д.
просто гулять по массиву наверное не корректно, если особенно в нем могут по другим условиям меняться биты, мы же всей картины не знаем.
:) да чтож такое то, ключевое слово здесь стек а не массив с изменяющимися значениями. У стека есть определенное место для входа значения и определенное место для выхода, иными словами внутри блока массив меняется только в двух местах, но ни кто не запрещает из вне прочитать массив полностью зная начальную и конечную точки
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot