![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Байты с битами
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);
Нужные биты выбираешь, варьируя маски