Главная страница
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.05 c
2-1140982178
WestBronx
2006-02-26 22:29
2006.03.12
Список файлов в папке


15-1139738701
Kerk
2006-02-12 13:05
2006.03.12
Персональный игнорлист 0.75


5-1127113687
kivadim
2005-09-19 11:08
2006.03.12
Что изменить в CheckListBox чтоб галочки не ставились?


15-1140370249
Stas_on
2006-02-19 20:30
2006.03.12
Светодиоды и COM-порт


2-1140607527
Клон
2006-02-22 14:25
2006.03.12
Charset в Idmessage