Вниз
Скачать: CL | DM;

Байты с битами   Найти похожие ветки 

 
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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.024 c
2-1140085820
PoetOfDelphi
2006-02-16 13:30
2006.03.12
Когда создать модуль данных


2-1140787477
Костя
2006-02-24 16:24
2006.03.12
Замена строки в Memo


3-1137764603
UnDISCOvery
2006-01-20 16:43
2006.03.12
ADOConnection не отпускает БД Access после Close!


15-1140247857
Mozart
2006-02-18 10:30
2006.03.12
lynx -dump


15-1139893971
Думкин
2006-02-14 08:12
2006.03.12
Марсеру 20 лет.




   Наверх