Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: 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 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1139157092
Ling
2006-02-05 19:31
2006.03.12
Работа со скролами


15-1139922163
Styx_
2006-02-14 16:02
2006.03.12
Вот кому Борланд продал Delphi :)


4-1134578377
La_Grange
2005-12-14 19:39
2006.03.12
Работа с системным динамиком)


2-1141022416
КаПиБаРа
2006-02-27 09:40
2006.03.12
Просьба скачать страницу


4-1135080255
Edit
2005-12-20 15:04
2006.03.12
Прозрачный TEdit