OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 14 Декабрь, 2024 01:43

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




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Побитовые операции
СообщениеДобавлено: Пятница, 28 Апрель, 2006 08:18 

Зарегистрирован: Суббота, 22 Апрель, 2006 21:30
Сообщения: 35
Почему:

Byte:=240;
IF Byte & 8 THEN DoSomeThing();

Не хочет работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 28 Апрель, 2006 12:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Так побитовых операций в Оберонах нет применительно к INTEGER. INTEGER надо истрактовать как SET (он в КП всегда только 32-битный {0..31}), затем провести операции над множествами, потом вернуть в INTEGER. Например, and - это пересечение множеств, *:
ORD(BITS(a)*BITS(b))
or - сложение множеств, +:
ORD(BITS(a) + BITS(b))
xor - симметрическая разность, /:
ORD(BITS(a) / BITS(b))
not - дополнение множества, -:
ORD(-BITS(a))
Никаких накладных расходов эти операции не вносят, это те же побитовые операции в завуалированной форме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Апрель, 2007 02:03 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Получается, простая операция сброса одного бита в байте, которая на Си записывается

Код:
byte = byte & ~(1<<(7-bit_pos))


превращается в

Код:
byte := SHORT(SHORT(ORD(BITS(byte) * (-BITS(ASH(1, 7-bit_pos))))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 05 Апрель, 2007 08:40 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1435
Немного проще
Код:
byte := SHORT(SHORT(ORD(BITS(byte) - {7-bit_pos})))


Но, вообще говоря, незачем заводить переменную типа BYTE, чтобы сбрасывать в ней биты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 06 Апрель, 2007 11:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Trurl писал(а):
Немного проще
Код:
byte := SHORT(SHORT(ORD(BITS(byte) - {7-bit_pos})))


Но, вообще говоря, незачем заводить переменную типа BYTE, чтобы сбрасывать в ней биты.[/code]
Вот вот. В КП это делается гораздо проще.
Код:
VAR a: SET;...
a := a - {bit_pos};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 06 Апрель, 2007 18:16 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Евгений Темиргалеев писал(а):
Вот вот. В КП это делается гораздо проще.
Код:
VAR a: SET;...
a := a - {bit_pos};


Не так все просто...
Если потом эти множества записать в файл (потоком байтов), то где гарантия что 4 байта SET будут записаны в нужном порядке (big-endian или little-endian)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 06 Апрель, 2007 20:23 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2459
Откуда: Россия, Томск
PGR писал(а):
Не так все просто...
Если потом эти множества записать в файл (потоком байтов), то где гарантия что 4 байта SET будут записаны в нужном порядке (big-endian или little-endian)?

Есть такая константа: Kernel.littleEndian* = True;
Активно используется модулем Stores при записи и чтении. См., например, Stores.Reader.ReadSet или Stores.Writer.WriteSet.
Так что если будете пользоваться стандартными средствами, проблем не будет. Если будете изобретать свое колесо, то просто учитывайте значение константы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Побитовый AND
СообщениеДобавлено: Среда, 14 Октябрь, 2009 18:47 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Прикреплена тема "Побитовый AND" из viewforum.php?f=2

Не нашел в среде. Сляпал свой. Может надо кому...

MODULE My;
IMPORT StdLog, SYSTEM;

PROCEDURE [code] BitAnd*(a: INTEGER; b: INTEGER) :INTEGER
05BH, 021H, 0D8H;


PROCEDURE Do*;
VAR i, j: INTEGER;
BEGIN
FOR j:=0 TO 100 DO
i:=BitAnd(j,5);
StdLog.Int(i);
END;
END Do;
END My.
My.Do


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовый AND
СообщениеДобавлено: Среда, 14 Октябрь, 2009 18:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Побитовые операции делаются через тип SET и преобразования BITS(int_val) и ORD(set_val).

См.:
viewtopic.php?f=29&t=185

(разумеется, никаких накладных расходов это не добавляет; операции чисто компиляторные).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовый AND
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:50 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Илья Ермаков писал(а):
...
(разумеется, никаких накладных расходов это не добавляет; операции чисто компиляторные).

Действительно...
Скомпоновал вот это в DLL:
MODULE FDLL;
IMPORT SYSTEM;

PROCEDURE [code] Bit(a: INTEGER; b: INTEGER) :INTEGER
05BH, 021H, 0D8H;

PROCEDURE BitAnd1*(a: INTEGER; b: INTEGER) :INTEGER;
BEGIN RETURN Bit(a,b) END BitAnd1;

PROCEDURE BitAnd2*(a: INTEGER; b: INTEGER) :INTEGER;
BEGIN RETURN ORD(BITS(a)*BITS(b)) END BitAnd2;

END FDLL.
:!: DevLinker.LinkDll
FDLL2.dll := FDLL# ~


Disassembler выдал такое:
Exported fn(): BitAnd1 - Ord:0001h
:00401035 55 push ebp
:00401036 8BEC mov ebp, esp
:00401038 57 push edi
:00401039 56 push esi
:0040103A FF750C push [ebp+0C]
:0040103D 8B4508 mov eax, dword ptr [ebp+08]
:00401040 5B pop ebx
:00401041 21D8 and eax, ebx
:00401043 8D65F8 lea esp, dword ptr [ebp-08]
:00401046 5E pop esi
:00401047 5F pop edi
:00401048 5D pop ebp
:00401049 C20800 ret 0008

Exported fn(): BitAnd2 - Ord:0002h
:0040104C 55 push ebp
:0040104D 8BEC mov ebp, esp
:0040104F 57 push edi
:00401050 56 push esi
:00401051 8B4508 mov eax, dword ptr [ebp+08]
:00401054 23450C and eax, dword ptr [ebp+0C]
:00401057 8D65F8 lea esp, dword ptr [ebp-08]
:0040105A 5E pop esi
:0040105B 5F pop edi
:0040105C 5D pop ebp
:0040105D C20800 ret 0008

Разницы практически никакой :)
Кстати процедура Bit в DLL не компонуется почему-то. Нужно в обычную упаковывать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовый AND
СообщениеДобавлено: Среда, 14 Октябрь, 2009 20:52 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы не забывайте, что вы декомпилируете код для процедуры.

И там куча обвязки по сохранению регистров, и т.п. Всё как положено.

Битовые операции пишутся по месту (без введения процедур).
Вот как раз и код: :00401054 23450C and eax, dword ptr [ebp+0C]
Просто and. Остальное - доставка к этому and параметров неизвестно зачем введённой процедуры :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 10:04 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Цитата:
big-endian или little-endian
Кстати, проблема, как мне кажется, в значительной степени надуманная: всё равно не существует big-endian реализации Блэкбокса, так чего воду мутить? Надо просто в спецификации сказать, что всё всегда сериализуется в little-endian, а те несчастные которые работают на big-endian машинах вот пусть сами и парятся при десериализации, а мы парится не будем :D .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 10:15 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1435
Сергей Губанов писал(а):
всё равно не существует big-endian реализации Блэкбокса, так чего воду мутить? .

Смотря в каком смысле понимать "существует".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 10:21 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
И в каком смысле?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции
СообщениеДобавлено: Четверг, 15 Октябрь, 2009 11:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Для PowerPC ведь валяется... Версия 1.3.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Побитовые операции над числами
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 22:47 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Присоединено к уже существующей теме.

За неимением функций побитовой работы над целами числами решил написать такие процедуры.
Насколько я понял из документации, побитовые операции делаются через множества.

При такой реализации BB сообщает о 2 ошибках.
Код:
MODULE bitwise_test;

PROCEDURE BitAnd (a, b: INTEGER): INTEGER;
VAR
   R: SET;
   I: INTEGER;
BEGIN
   R := {a} * {b};
   I := INTEGER(R); (* здесь *)
   RETURN I;
END Bitand; (* и здесь *)

END bitwise_test.


Это понимать как неверное приведение одного типа к другому?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции над числами
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 22:52 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Для приведения целогоь к множеству и обратно надо встроенные функции КП использовать. Они прописаны в сообщении о языке - посмотрите в справочнике ББ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции над числами
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 22:53 

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 247
Я делал
Код:
ORD(BITS(a)*BITS(b))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции над числами
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 22:54 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Какую страницу, не подскажете? (англ. версия)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Побитовые операции над числами
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 22:56 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
В самом конце документа встроенные функции.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

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


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

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


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

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