Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 27.08.2019, 14:31   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 206
Репутация: 62

icq: 418328851
По умолчанию Битовые маски

Привет, есть число -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 в 15:57. Причина: опечатка не -32678, а -32768
PTyTb32 вне форума   Ответить с цитированием
Старый 27.08.2019, 15:42   #2
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,830
Репутация: 5617
По умолчанию

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

icq: 418328851
По умолчанию

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

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

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

Код:
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, 22:38   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,830
Репутация: 5617
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


02:48.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.