Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];

Вниз

Циклическая перестановка байтов в integer   Найти похожие ветки 

 
Катерина   (2003-06-05 13:59) [0]

Как выполнить перестановку байтов в integer: 1 на 4, 4 на 3, 3 на 2 и 2 на 1?


 
Palladin   (2003-06-05 14:02) [1]

представить как массив байт
а зачем?


 
Катерина   (2003-06-05 14:08) [2]

Такой формат записи в бинарном файле (сейсмические данные). А что-то типа swap, как для word, нет? Swap, конечно и для 4-х байтных целых работает, но только первые 2 байта переставляет


 
Skier   (2003-06-05 14:14) [3]


> конечно и для 4-х байтных целых работает, но только первые
> 2 байта переставляет

Первые и последние байты можно "выделять" через
побитовое сложение and
Если это как-то поможет...


 
pasha676   (2003-06-05 14:20) [4]

Есть маски которые можно накладвать (по and и по or) и есть сдвиги shr shl - комбинацией можно запросто достич нужный результат.


 
reonid   (2003-06-05 14:22) [5]

Для четырёх последних примерно так:

const
Mask = $F// 1111
var
Source: Integer;
tmp: Word;
first_bit: Word;


tmp := Source and Mask; // выделяем 4 последних бита
first_bit := tmp and $1; // выделяем первый бит
tmp := tmp shr 1; // Сдвижка влево 4->3, 3->2, 2->1
first_bit := first_bit shl 4; // сдвигаем первый бит на позицию четвёртого.
tmp := tmp or first_bit; // объединяем 4 результирующих бита.

Source := Source and ($FFFFFFFF - Mask); //Очищаем 4 бита, куда потом запишем результат
Source := Source or tmp; // Записываем результат.

Набрал сходу, на ошибки не проверял.


 
reonid   (2003-06-05 14:25) [6]

> Сдвижка влево
вправо


 
Катерина   (2003-06-05 14:25) [7]

Спасибо, я такие вещи только на ассемблере делала, а сейчас обязательное условие - паскаль.


 
VMcL   (2003-06-05 14:26) [8]

>Катерина © (05.06.03 13:59)

function RotR(A: Integer): Integer; register;
asm
ror eax, 8
end;


 
Anatoly Podgoretsky   (2003-06-05 14:26) [9]

and/or/sh?


 
Sha   (2003-06-05 15:43) [10]

>Катерина © (05.06.03 13:59)
>Как выполнить перестановку байтов в integer: 1 на 4, 4 на 3, 3 на 2 и 2 на 1?
i:=(i shr 8) or (i shl 24);


 
Катерина   (2003-06-05 16:31) [11]

Спасибо всем. В процессе выяснилось, что надо поменять порядок байтов: 4 на 1, 3 на 2, 2 на 3 и 1 на 4. У меня получилось следующее:


function swapInt (Source : integer) : integer;
begin
Result := (swap(Source) shl 16) or (swap(Source shr 16));
end;


 
Anatoly Podgoretsky   (2003-06-05 16:42) [12]

Правильно.


 
Sha   (2003-06-05 17:16) [13]

или так
function swapInt (Source : integer) : integer;
asm
bswap eax
end;


 
Anatoly Podgoretsky   (2003-06-05 17:28) [14]

Sha © (05.06.03 17:16)
Это да, но лучше ищбажать использования ассемблера, там где и так достаточно эффективно. Может придется переносить куда либо.


 
pasha676   (2003-06-05 18:00) [15]


> Result := (swap(Source) shl 16) or (swap(Source shr 16));

Красиво. У меня получилось бы менее изящно. Обычно я разбираю по байтно потом сдвигаю и складываю. А со свапами красиво...


 
Sha   (2003-06-05 19:55) [16]

2Anatoly Podgoretsky © (05.06.03 17:28)
согласен


 
Anatoly Podgoretsky   (2003-06-05 20:18) [17]

Ну значит она посмотрела справку и получилось очень красиво, а если без учет возможного переноса, то bswap самое то (а если не знать про bswap то есть еще и xchg+сдвиги, плюч еще возмозность дополнительного ускорения. Дополнительно можно посмотреть сетевые функции АПИ там что то есть по смене порядка байтов, но эффективности это уже не увеличит.

Короче, браво Катерина, показала как надо писать.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.092 c
4-60452
velsi
2003-04-17 12:38
2003.06.19
TaskbarCreated


3-60029
prihod
2003-05-27 15:52
2003.06.19
??? Как обновлять TDBGrid ???


3-60084
YuraKiller
2003-05-28 21:32
2003.06.19
Как с клиента создать пользователя?


6-60301
PVOID
2003-04-16 14:27
2003.06.19
Помогите пожалуйста разобраться с RAS


11-60100
Alexander
2002-09-12 16:32
2003.06.19
Если у программы активно модальное окно, то при активизации тем





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский