Форум: "Основная";
Текущий архив: 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