![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Итак есть 4 байта данных и нам необходимо получить 4 числа по следующей схеме. Начиная с 9-го бита этой 32-битной последовательности взять 6 бит и полученный результат представить как символ/число. Затем уже с 15 бита снова взять 6 бит и сделать тоже самое, и так 4 раза сдвигаясь вправо по 6 бит.
Вот интересует ваше решение данной задачки ибо то как я это делаю мне как-то стремно даже выкладывать. ![]() |
|
#2
|
||||
|
||||
|
Представляю проект "Старая печатная машинка"
Код:
var i:integer; begin ........................... i:=63636363; ............................ c1:=i shl 8; c1:=c1 shr 26; c2:=i shl 14; c2:=c2 shr 26; c3:=i shl 20; c3:=c1 shr 26; c4:=i shl 26; c4:=c4 shr 26; end |
|
#3
|
|||
|
|||
|
Ничего не понял.
Так что-ли: Код:
var
Src : DWORD;
A : String[4];
I : Integer;
begin
Src := Src Shr 8;
For I := 1 To 4 Do
Begin
A[i] := Chr(Src Or 63); // 63 = 00111111
Src := Src Shr 6;
End; |
|
#4
|
||||
|
||||
|
В общем и я так сделал, только я сдвиг влево и вправо объединил как одно действие. Есть еще варианты?
|
|
#5
|
||||
|
||||
|
Ага, а вот вариант lmikle уже несколько иначе работает. Уже интересно. Что еще интересно предложат пытливые умы.
|
|
#6
|
||||
|
||||
|
Собственно это часть алгоритма кодирования Base64
|
|
#7
|
||||
|
||||
|
Ещё вариант:
Код:
procedure TForm1.Button1Click(Sender: TObject); Var DW: DWORD; //32b B9, B15: Byte; //8b i: Integer; begin //DW:= 16128; //00000000 00000000 00111111 00000000 DW:= 1032192; //00000000 00001111 11000000 00000000 B9:= 0; B15:= 0; For i:= 8 To 14 Do if ((DW Shr i) And 1) = 1 Then B9:= ((1 shl (i - 8)) Or B9); For i:= 14 To 20 Do if ((DW Shr i) And 1) = 1 Then B15:= ((1 shl (i - 14)) Or B15); //И.т.д. Form1.Caption:= IntToStr(B15); //B = 63, 111111 end; |
|
#8
|
||||
|
||||
|
Код:
var
i: DWORD;
i1, i2, i3, i4: Byte;
begin
i:=$EF7D1D99; // 111011 110111 110100 011101 10011001
i1:=(i shr 8) and $3f;
i2:=(i shr 14) and $3f;
i3:=(i shr 20) and $3f;
i4:=(i shr 26) and $3f;
{
1D
34
37
3B
}
end; |