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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2019, 13:31   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Битовые маски

Привет, есть число -32768 в формате Double как правильно получить из него 0000000000000001? речь о модуле дискретного ввода и состояния всех его параметров находятся в одном регистре (в двух). вот как пробовал это делать:
Код:
type
  TRec = packed record
    case Integer of
      0 : (LB, HB: Byte);
      1 : (W: Word);
  end;     


function TForm1.ShowBits(a: byte): string;
var
  i: integer;
begin
  for i := 15 downto 0 do
    if a and (1 shl i) <> 0 then
      tlabel(FindComponent('label' + IntToStr(19 + i))).Caption := '1'
    else
      tlabel(FindComponent('label' + IntToStr(19 + i))).Caption := '0';
end;   

procedure TForm1.Button1Click(Sender: TObject);
var
  f: double;
  b: byte;
begin

  f:=0 - mv110.GetStateDigitalInput(PLCTagNumber1, 2, 16); //функция вернет значение из регистра на устройстве
  Rec.LB:=f.Bytes[6];
  Rec.HB:=f.Bytes[7];
  ShowBits(Rec.W);
{
// так же пробовал эти варианты.. результат не верен
 ShowBits(f.Bytes[6]);
 ShowBits(f.Bytes[7]);

}

  Label1.Caption := floattostr(f);
end;

Последний раз редактировалось PTyTb32; 27.08.2019 в 14:57. Причина: опечатка не -32678, а -32768
PTyTb32 вне форума Ответить с цитированием
Старый 27.08.2019, 14:42   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
-32678 в формате Double
формат Double - это вещественное представление числа (в виде мантиссы и порядка). Вы ничего не путаете?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.08.2019, 14:54   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
формат Double - это вещественное представление числа (в виде мантиссы и порядка). Вы ничего не путаете?
компонент возвращает полученное значение в этом формате, если получить значение регистра на прямую любой другой программой я получаю то же самое число (исправлена опечатка в самом числе)

решение оказалось простым... полученное число не нужно делать отрицательным как в сторонних программах, просто переводим его в двоичный вид и дописываем в начало недостающее количество '0'.

Последний раз редактировалось PTyTb32; 27.08.2019 в 16:38.
PTyTb32 вне форума Ответить с цитированием
Старый 27.08.2019, 18:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
program DoubleToBin;

var d: Double;
    p: ^Byte;
    k: Integer;
    res: String;

function ByteToStr(Value: Byte): String;
var s: String;
    i: Integer;
begin
  s:='';
  for i:=0 to 7 do if Value and (1 shl i) = 0 then s:='0'+s else s:='1'+s;
  ByteToStr:=s;                              
end;

begin
  d:=-32768;
  p:=Addr(d);
  res:='';
  for k:=1 to 8 do begin
    res:=ByteToStr(p^)+res;
    Inc(p);
  end;  
  writeln(Res);
  //1100000011100000000000000000000000000000000000000000000000000000
end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.08.2019, 21:38   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
просто переводим его в двоичный вид и дописываем в начало недостающее количество '0'.
Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
Привет, есть число -32768 в формате Double как правильно получить из него 0000000000000001
ха. Так у Вас число записано "задом наперёд":
32768 в двоичном виде это 1000000000000000b
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.08.2019, 02:06   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
решение оказалось простым...
Но весьма не очевидно что оно ещё и правильное.
northener вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MaskEdit - маски Alana Компоненты Delphi 4 20.10.2010 10:34
маски лапласиана PROVIDENCE Помощь студентам 0 16.03.2010 22:48
С++ Маски selumin Помощь студентам 2 12.10.2009 21:40