OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 25 Сентябрь, 2020 07:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Двоичная математика
СообщениеДобавлено: Вторник, 19 Февраль, 2008 20:22 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 248
Откуда: Austria, Bruck
Математики, просьба помочь вот с такой задачей:
необходимо реализовать следующую функцию
x[2*i+1] = NOT x[2*i],
где x[] - бит в слове x
i - номер 2-битной группы
Или словами: необходимо инвертировать каждый четный бит, и записать результат в нечетный с большим индексом.
Основное условие: использовать как можно меньше операций над словами.

Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Двоичная математика
СообщениеДобавлено: Вторник, 19 Февраль, 2008 21:30 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Если я верно понял, то:
x, res: INTEGER;
even_bits: SET;
even_bits := BITS(x) * {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30};
res := ORD(even_bits + BITS(ASH(ORD(-even_bits), 1)));

Реальных операций только три: *, + и - (побитовый and, or и not соответственно).
Остальное - преобразования этапа трансляции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Двоичная математика
СообщениеДобавлено: Среда, 20 Февраль, 2008 10:03 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 248
Откуда: Austria, Bruck
Илья, спасибо.

Уже решил задачку. Хороший сон положительно сказывается на сообразительности :)
НЕ все варианты проверил, но по идее должно работать:

(* псевдокод *)
CONST
m1 = 2#10101010 (* маска групп*)
m2 = ~m1 (* инвресная маска *)
VAR
x: BYTE;
y: BYTE;
BEGIN
y := ASH(x); (*сдвигаем на 1 разряд влево*)
y := ~(y AND m1) AND (y OR m1); (* y := y XOR m1 *)
y := y OR m2;
END.

Мне надо на ассемблере сделать, для довольно экзотического ПЛК, в котором каждая команда от 2 до 5 байт занимает, при работе с битовыми полями. А памяти, как всегда, мало. :) Для 32-битных слов этот код занимает около 30 байт. А если делать красиво по-битово, то хапает сразу около 300 байт.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB