Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
9-1126094102
rsy
2005-09-07 15:55
2006.03.12
Ресурсы для игры


2-1140519656
лом
2006-02-21 14:00
2006.03.12
Такой вопрос


3-1138017617
HabarovSergey
2006-01-23 15:00
2006.03.12
DB-компоненты, многопользовательская среда, вылазят грабли


4-1134833366
HandleFinder
2005-12-17 18:29
2006.03.12
Как найти Handle окна сообщения ShowMessage ?


3-1137220767
Е.
2006-01-14 09:39
2006.03.12
Access, ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский