Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизБайты с битами Найти похожие ветки
← →
Sower (2006-02-21 20:05) [0]Есть байт
A
, нужно присвоить ему такое значение: допустим, три бита из байтаB
(не обязательно первых), и пять бит из байтаC
Я делаю так: сдвигаю байтB
сначала вправо на нужное количество бит, потом влево на5
. Также и с байтомC
. ТогдаA = B+C
Может есть лучше способ?
Спасибо.
← →
MBo © (2006-02-21 20:20) [1]A := (B and $E0) or (C and $1F);
Нужные биты выбираешь, варьируя маски
← →
Sower (2006-02-21 20:55) [2]Это будет быстрей выполнятся?
← →
TUser © (2006-02-21 20:57) [3]> Это будет быстрей выполнятся?
Да. Можно убедиться, посмотрев в CPU window - сколько где команд.
Зы. Поищи статью А. Подгорецкого (кажется на Королевстве Delphi) про битовую арифметику. Прочитай.
← →
Sower (2006-02-21 20:57) [4]Получается что у меня 5 операций, а так 3?
← →
Sower (2006-02-21 20:57) [5]спасибо
← →
Sower (2006-02-23 14:38) [6]Начал разбираться и возникла проблема.
Данный способ не совсем подходит, вы не поняли в чем задача.
Поясню на примере:
Два байта.
B = 10010011
C = 10110101
Мне нужно, из двух, например, последних бит байта B, и четырех первых бит байта C слепить байт A (из 6 бит), чтобы вышло в данном случае: 10010011 & 10110101 = 111011 00
Приходится выполнять опять же два сдвига.
← →
Sower (2006-02-23 14:40) [7]
> Приходится выполнять опять же два сдвига.
Так и делать?
← →
Sower (2006-02-23 19:28) [8]?
← →
Desdechado © (2006-02-23 20:30) [9]> слепить байт A из 6 бит
какой-то некондиционный байт...
> Приходится выполнять опять же два сдвига.
ну, если тебе куски исходных байтов должны попасть в новые места результирующего байта, то двигать все равно придется. А дальше маски.
← →
palva © (2006-02-23 20:57) [10]
Можно с одним сдвигом, но понадобиться рабочая переменная типа 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 21:01) [11]palva © (23.02.06 20:57) [10]
гонять между переменными дольше
← →
Anatoly Podgoretsky © (2006-02-23 21:44) [12]TUser © (21.02.06 20:57) [3]
Есть и на моем сайте
← →
Anatoly Podgoretsky © (2006-02-23 21:46) [13]Sower (21.02.06 20:57) [4]
Не стоит измерять быстродействие в количестве операций на современных процессорах, некоторые команды могут выполяться две сразу за один такт, а есть команды которые требуют 0 тактов, а есть которые измеряются в десятках. А еще есть пенальти, когда одна и таже команда может выполниться или за один так или за 17.
На моем сайте, кроме статьи по работе с битами есть еще и две статьи по работе с ассемблером, где затронуты эти моменты.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c