Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  03:32[Войти] | [Зарегистрироваться]
Ответ на вопрос № 67399

18-12-2008 08:58
Добрый день!

Возникла задача работать с переменной типа Word как с тремя отдельными переменными
a1 - первые 5 бит, а2 - вторые 5 бит и а3 - остальные 6 бит.

т.е. определить такой обьект b, общий размер которого был бы равен 2 байтам и в составе которой были бы переменные а1, а2, а3.

что-то вроде такого

b.a1 - 0-31
b.a2 - 0-31
b.a3 - 0-63

не очень понятно выразил мысль, но мне кажется, вы поймете о чем я.

подскажите, как такое можно реализовать?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

22-12-2008 03:14
Помоему код уже нет необходимости оптимизировать
Почему же? Вроде оптимизация кода никогда не считалась излишней.

20-12-2008 17:26
>>>специально сидел с калькулятором считал чтобы никому небыло понятно?
Да, совсем я обленился. А вот насчет ассемблера не уверен. Помоему код уже нет необходимости оптимизировать.

20-12-2008 05:53
Странно даже, что приходится объяснять такие простые вещи
Это все в общем-то и так ясно. Я поднял этот вопрос к тому, что стоит ли усложнять простые вещи, решаемые с помощью обычных логических операций.

19-12-2008 11:59 | Комментарий к предыдущим ответам
>>>А если написать их на ассемблере, то быстродействие будет максимальным

Если используется Delphi 2006 и выше, то наиболее оптимальным в этом случае будет использование inline. К сожалению, компилятор так и не научился вставлять код на ассемблере как inline.

19-12-2008 06:51
Ага, я тоже согласен что такое лучше делать через классы.
А насчет констант в последнем примере ... специально сидел с калькулятором считал чтобы никому небыло понятно? Ведь подобные константы лучше всего и наглядней выражать в шестнадцатеричном виде!
Например, "00000011 11100000" запишется как $03E0 и сразу видно что к чему а не непонятное число 992.

19-12-2008 02:03
Ну зачем же так усложнять и делать класс?

Затем, что это обеспечивает инкапсуляцию данных. Методы оказываются привязаны к данным, а прямая модификация данных в обход обрабатывающих их алгоритмов извне невозможно, что повышает безопасность. Странно даже, что приходится объяснять такие простые вещи.

19-12-2008 01:47
Ну зачем же так усложнять и делать класс? Ведь можно написать всего-навсего несколько процедур, как у  0nni, которые будут выбирать и возвращать нужные биты. А если написать их на ассемблере, то быстродействие будет максимальным.

18-12-2008 09:26 | Сообщение от автора вопроса
да-да.. я уже понял.. просто раньше писал на си, там была возможность создания таких структур, вот по аналогии и искал что-то подобное в делфи.. а надо было в другом направлении думать..

18-12-2008 09:23


function GetWordA(const w : Word) : byte;
begin
  result := w and 31;//00000000 00011111
end;

function GetWordB(const w : Word) : byte;
begin
  result := (w and 992) shr 5;//00000011 11100000
end;

function GetWordC(const w : Word) : byte;
begin
  result := (w and 64512) shr 10;//11111100 00000000
end;


function SetWordA(const w : Word; const i : byte) : Word;
begin
  result := (w and not 31) or (i and 31);//00000000 00011111
end;

function SetWordB(const w : Word; const i : byte) : Word;
begin
  result := (w and not 992) or ((i and 31) shl 5) ;//00000000 00011111
end;

function SetWordC(const w : Word; const i : byte) :Word;
begin
  result := (w and not 64512) or ((i and 63) shl 10) ;//11111100 00000000
end;


вот
а - нижние 5 бит
b - следующие 5
с - последние 6
Посмотрите булевую алгебру ;)

18-12-2008 09:13 | Сообщение от автора вопроса
ухты.. класс! спасибо.. то, что надо!

18-12-2008 09:07
Такой объект определить не получится, в Delphi нет битовых полей. Можно сделать класс-обёртку над Word, который будет содержать свойства a1, a2 и a3 и работать с ними через сеттеры. Что-то типа такого (пример для a2):

type
  TWordWrapper = class
  private
    FB:Word;
    function GetA2: Integer;
    procedure SetA2(Value: Integer);
  publuc
    property B: Word read FB write FB;
    property A: Integer read GetA2 write SetA2;
  end;

function TWordWrapper.GetA2: Integer;
begin
  Result := (FB and $03E0) shr 5;
end;

procedure TWordWrapper.SetA2(Value: Integer);
begin
  if (value < 0) or (value > 31) then
    raise Exception.Create('Выход за пределы диапазона');
  FB := (FB and $FC1F) or (value shl 5);
end;


Ну, и с A1 и A3 по аналогии...

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования