Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Байты с битами


Sower ©   (2006-02-21 20:05:00) 

Есть байт A, нужно присвоить ему такое значение: допустим, три бита из байта B(не обязательно первых), и пять бит из байта C
Я делаю так: сдвигаю байт Bсначала вправо на нужное количество бит, потом влево на 5. Также и с байтом C. Тогда A = B+C
Может есть лучше способ?
Спасибо.


Anatoly Podgoretsky   (2006-02-23 21:46:00) [1]

Sower   (21.02.06 20:57) [4]
Не стоит измерять быстродействие в количестве операций на современных процессорах, некоторые команды могут выполяться две сразу за один такт, а есть команды которые требуют 0 тактов, а есть которые измеряются в десятках. А еще есть пенальти, когда одна и таже команда может выполниться или за один так или за 17.
На моем сайте, кроме статьи по работе с битами есть еще и две статьи по работе с ассемблером, где затронуты эти моменты.


Anatoly Podgoretsky   (2006-02-23 21:44:00) [2]

TUser ©   (21.02.06 20:57) [3]
Есть и на моем сайте


Desdechado   (2006-02-23 21:01:00) [3]

palva ©   (23.02.06 20:57) [10]
гонять между переменными дольше


palva   (2006-02-23 20:57:00) [4]


Можно с одним сдвигом, но понадобиться рабочая переменная типа Word
{$APPTYPE CONSOLE}
uses SysUtils;
var
 a: Byte;
 b: Byte = $93; // 1001 0011
 c: Byte = $B5; // 1011 0101
 i: Word;
begin
 i := c;
 PByteArray(@i)[1] := b;
 a := (i And $03F0) Shr 2;
 WriteLn(IntToHex(a, 2)); // печатает EC, то есть 1110 1100
end.


Desdechado   (2006-02-23 20:30:00) [5]

> слепить байт A из 6 бит
какой-то некондиционный байт...

> Приходится выполнять опять же два сдвига.
ну, если тебе куски исходных байтов должны попасть в новые места результирующего байта, то двигать все равно придется. А дальше маски.


Sower   (2006-02-23 19:28:00) [6]

?


Sower   (2006-02-23 14:40:00) [7]


> Приходится выполнять опять же два сдвига.

Так и делать?


Sower   (2006-02-23 14:38:00) [8]

Начал разбираться и возникла проблема.
Данный способ не совсем подходит, вы не поняли в чем задача.
Поясню на примере:

Два байта.
B = 10010011
C = 10110101

Мне нужно, из двух, например, последних бит байта B, и четырех первых бит байта C слепить байт A (из 6 бит), чтобы вышло в данном случае: 100100 11& 10110101 = 111011 00
Приходится выполнять опять же два сдвига.


TUser   (2006-02-21 20:57:00) [9]

> Это будет быстрей выполнятся?

Да. Можно убедиться, посмотрев в CPU window - сколько где команд.

Зы. Поищи статью А. Подгорецкого (кажется на Королевстве Delphi) про битовую арифметику. Прочитай.


Sower   (2006-02-21 20:57:00) [10]

Получается что у меня 5 операций, а так 3?


Sower   (2006-02-21 20:57:00) [11]

спасибо


Sower   (2006-02-21 20:55:00) [12]

Это будет быстрей выполнятся?


MBo   (2006-02-21 20:20:00) [13]

A := (B and $E0) or (C and $1F);
Нужные биты выбираешь, варьируя маски


Наверх

Титульная страница Поиск, карта сайта Написать письмо