Главная страница
    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.008 c
7-60439
Brand2000
2003-04-15 06:25
2003.06.19
Смена разрешения экрана не отображает панель задач


3-60057
stkatch
2003-05-28 11:19
2003.06.19
Оператор BREAK в IB


1-60264
SiJack
2003-06-06 09:18
2003.06.19
Срочный вопрос !!!! Как получить путь к Program Files ?


1-60265
AlexanderG
2003-06-05 19:57
2003.06.19
Список доступных принтеров


3-60088
LeReve
2003-05-27 23:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский