Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2008, 15:17   #1
lacost
Пользователь
 
Регистрация: 25.03.2007
Сообщений: 67
По умолчанию Работа с двоичным кодом

помогите решить такую задачу:

Есть положительное число типа Integer - последовательность 4-х байт если я не ошибаюсь

есть также массив из 8 байт mass array [0..7] of byte

так вот необходимо сделать такую вещь:

из первого байта integer сбросить в ноль первый бит пердварительно его запомнив и записать его в массив байтов.

во втором байте сдвинуть все биты влево, и присвоить значение последнего байта (самому правому) запомненного байта на предыдущей итерации

ну и дальше продолжать в таком духе, идеи конечно етсь но туманные, понимаю что наверно нужно использовать побитовое and и or а для звдига shi илил shr забыл уже блин) Может кто нибудь прольёт свет на мой вопрос? буду благодарен
lacost вне форума Ответить с цитированием
Старый 18.11.2008, 15:59   #2
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Кодировать что-то собрался?
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 18.11.2008, 18:36   #3
lacost
Пользователь
 
Регистрация: 25.03.2007
Сообщений: 67
По умолчанию

Это кодировение велечин переменной длины в midi файлах таким спосбом создатели пару килобайт места экономили, когда память была на вес золота а мне вот теперь лишняя морока.
lacost вне форума Ответить с цитированием
Старый 18.11.2008, 18:43   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и присвоить значение последнего байта (самому правому) запомненного байта на предыдущей итерации
Уф-ф-ф чет не вьехал в алгоритм...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2008, 19:11   #5
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

Да, как-то невнятно, хотя я в свое время с ассемблером возился...
Ash вне форума Ответить с цитированием
Старый 18.11.2008, 22:09   #6
lacost
Пользователь
 
Регистрация: 25.03.2007
Сообщений: 67
По умолчанию

таак попробую доступней обьяснить с примерами....помогите уж мне ато я сам загнусь)

например у нас есть число скажем 428 типа integer - это число как параметр передайтся функции

что такое 428 это 110101100 в двоичной
тоетсь это последовательность из 9-и бит, масива бит так сказать

Integer это у нас последовательность четырёх байт верно? тоесть это чисто предстваленно следующим образом (исходя что в байте 8 бит)
1-й байт 00000000
2-й байт 00000000
3-й байт 00000001
4-й байт 10101100

первое что нужно это загнать эти байты в array of byte
далее уже будем работать с ними как с элементами массива типа byte

начинаем с 4-ого байта (10101100)
первый его бит нужно сбросить в ноль т.е. из (10101100) получить (00101100) но сброшенный байт тоесть то чно он =1 запоминаем

далее берём 3-й байт (00000001) сдвигаем все его элементы влево на 1 бит получим (00000010)
теперь на осовободившееся место (00000010) дописываем запомненый бит на передыдущей итерации должны получить (00000011)

Я с двоичным кодом никогда не работал плотно, как мне это реализовать может есть такие кто на этом уже собаку сьел ?

Последний раз редактировалось lacost; 18.11.2008 в 22:11.
lacost вне форума Ответить с цитированием
Старый 19.11.2008, 00:20   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ток не ясно что вообще происходит и что в итоге должно выйти...
А так на быструю руку исходя из последнего поста... за точность не ручаюсь )) думаю и сами сможете подрехтовать

Код:
var
  keep: Byte;
  v: Integer;
  b: array[0..3] of Byte absolute v;
begin
  v := 428; // ваше значение

  keep := (b[0] and $80) shr 7; // узнаем установлен ли бит 10000000, ну и ставим этот 8й бит на младшее место
  b[0] := b[0] and $7F; // сбрасываем бит маской 01111111

  b[1] := (b[1] shl 1) or keep; // смещаем влево и ставим первый сохраненный бит
end;
p.s. собаку не ел

Последний раз редактировалось BOBAH13; 19.11.2008 в 00:30.
BOBAH13 вне форума Ответить с цитированием
Старый 19.11.2008, 10:38   #8
lacost
Пользователь
 
Регистрация: 25.03.2007
Сообщений: 67
По умолчанию

BOBAH13, спасибо вам большое, как рас те примеры кода которые я ждал, теперь могу и сам всё привести в надлежащий вид, ещё рас спасибо.
lacost вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с кодом Кронос Общие вопросы Delphi 6 04.05.2008 21:13
Помогите с кодом prostoCHEL Общие вопросы Delphi 4 02.03.2008 21:56
Не понятно с кодом Михаил Юрьевич Общие вопросы Delphi 2 08.02.2008 08:07
Что с кодом ? Look Общие вопросы C/C++ 11 06.11.2007 14:48