|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Изъятия группы битов из DWord
Итак есть 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; If end Then begin; |
#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; Пишу программы за еду. __________________ |