Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> битовая логика 
V
    Опции темы
JS2
Дата 17.3.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



столкнулся с проблемой: 4-хбайтовое значение нужно записать в файл 1 установив для первого байта старший бит (1).  Дальше разбить 4-хбайтовое значение на 2 двухбайтовых, для первого 2-хбайтового занчения установить старшbй бит (1) для первого байта. 

Пытаюсь так:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  S: TStream;
  N: DWord;
  W: packed array [0..1] of Word absolute N;
begin
  N := 266;
 // Write to 1
  S := TFileStream.Create('1', fmCreate);
  try
    N := N or $80000000; // óñòàíàâëèâàåì áèò
    try
      S.Write(N, SizeOf(N));
    finally
      N := N and $FFFFFF; // ñáðàñûâàåì áèò
    end;
  finally
    S.Free
  end;
  // Write to 2
  S := TFileStream.Create('2', fmCreate);
  try
    W[0] := W[0] or $8000; // óñòàíàâëèâàåì áèò
    try
      S.Write(W[0], SizeOf(W[0]));
    finally
      W[0] := W[0] and $7FFF; // ñáðàñûâàåì áèò
    end;
    S.Write(W[1], SizeOf(W[1]));
  finally
    S.Free;
  end;
end;


В итоге: 

1 файл: 0A 01 00 80 
2 файл: 0A 81 00 00

Почему разные значения, что делаю не так?

PM MAIL   Вверх
kami
Дата 17.3.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Всё правильно выводит.
1. 266=$10A, при установке старшего бита двойного слова получается $8000010A. С учетом того, что в компьютерном представлении младший байт идет первым (по меньшему адресу, т.е. получается "обратная" запись), первый результат правильный.
2. 
Цитата(JS2 @  17.3.2010,  12:25 Найти цитируемый пост)
N := N and $FFFFFF;

Обнулил старший байт (хотя - зачем, в условии этого не было). Соответственно, число стало опять $10A. Ну а дальше - всё правильно, если под первым словом понимать младшее слово, а не старшее (в условии небольшая некорректность).

Добавлено через 3 минуты и 20 секунд
Цитата(JS2 @  17.3.2010,  12:25 Найти цитируемый пост)
W[0] := W[0] and $7FFF;

Напоследок - не понял этого маневра. Зачем это, если младшее слово потом не используется?
PM MAIL WWW   Вверх
JS2
Дата 17.3.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



Цитата

если под первым словом понимать младшее слово, а не старшее (в условии небольшая некорректность)


оказывается проблема была именно в этом. респект.  smile 

Это сообщение отредактировал(а) JS2 - 17.3.2010, 15:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1259 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.