Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Битовые значения.  [new]
akrush
Member

Откуда: Киев, Украина
Сообщений: 316
Использую Delphi XE2
Подскажите как правильно получить десятичное число из битового поля.
Есть битовое поле, 32 бита.
Десятичное число в нем - 661662
Побитно выглядит так (с 31 по 0 бит): 0000 0000 0000 1010 0001 1000 1001 1110
В этом числе хранится побитно 3 значения:
1. Дата - первые 16 бит (0-15): 0001 1000 1001 1110
2. Код специалиста - следующие 8 бит (16-23): 0000 1010
3. Признак расчета - 24 бит, сейчас установлен 0.

Кручу я разные методы смещений, получения значений и что-то не получается.
Покажите пожалуйста на примере:
var data,spec,calc,val:integer;
val:=661662;
data:= получить из val биты с 0 по 15
data:= получить из val биты с 16 по 23
data:= получить из val бит 24

Как такое можно сделать. Ну никак лыжи не хотят ехать
8 май 18, 12:28    [21395533]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
akrush
Member

Откуда: Киев, Украина
Сообщений: 316
akrush,
неточность:
data:= получить из val биты с 0 по 15
spec:= получить из val биты с 16 по 23
calc:= получить из val бит 24


в итоге хотелось бы получить:
data=6302
spec=10
calc=0
8 май 18, 12:30    [21395547]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24062
На здоровье. :)

TIntegerRec = packed record
    case Byte of
      1: (Lo: Word;
          Hi: Word);
      2: (LoLo: Byte;
          LoHi: Byte;
          HiLo: Byte;
          HiHi: Byte);
  end;

  TInt64 = packed record
    case Byte of
      0: (Lo: Integer;
          Hi: Integer);
      1: (LoLo: Word;
          LoHi: Word;
          HiLo: Word;
          HiHi: Word);
      2: (LoLoLo: Byte;
          LoLoHi: Byte;
          LoHiLo: Byte;
          LoHiHi: Byte;
          HiLoLo: Byte;
          HiLoHi: Byte;
          HiHiLo: Byte;
          HiHiHi: Byte);
  end;
8 май 18, 12:34    [21395565]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
akrush
Member

Откуда: Киев, Украина
Сообщений: 316
wadman,
и что дальше? :(
8 май 18, 12:41    [21395590]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24062
akrush,

приведение типов... TIntegerRec(myVal) и смотри, что там.

Либо вводишь в калькуляторе нужную единичку в двоичном формате, переключаешься в десятичный и получившееся число заносишь в константу. Затем по and с этим числом смотришь на результат.
8 май 18, 12:50    [21395636]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6000
akrush,

Если ничего не напутал с битами, то примерно так. Через битовые маски.

var V:DWORD;

begin
  V:=661662;
  Date:=V and $0FFFF;   // дата
  Code:=(V and $08FFF0000) shr 16; // код  
  Flag:=(V and $F0000000)<>0;  // признак
end;
8 май 18, 13:12    [21395716]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
rgreat
Member

Откуда:
Сообщений: 4252
А чего не через массив байт?
8 май 18, 13:45    [21395834]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6000
rgreat,

Назачем?
8 май 18, 14:05    [21395896]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6000
DarkMaster
akrush,

Если ничего не напутал с битами, то примерно так. Через битовые маски.

var V:DWORD;

begin
  V:=661662;
  Date:=V and $0FFFF;   // дата
  Code:=(V and $08FFF0000) shr 16; // код  
  Flag:=(V and $F0000000)<>0;  // признак
end;


Таки напутал. Должны быть маски $07FFF0000 и $80000000 для кода и признака. Исправлюсь :)
8 май 18, 14:08    [21395905]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24062
akrush
Подскажите какой запрос нужно выполнить во время подключения к Export.fdb чтобы перетянуть все данные из одной БД в другую.

Это 2 разных подключения, одним запросом не получится.

П.С. Так и нужно было называть тему "Все вопросы от меня в одной теме [+]". :)
10 май 18, 10:53    [21399288]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28968

10.05.2018 10:53, wadman пишет:
> Это 2 разных подключения, одним запросом не получится.

отнюдь.
но всё зависит от.

Posted via ActualForum NNTP Server 1.5

10 май 18, 11:13    [21399360]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6000
wadman,

EXECUTE STATEMENT ... ON EXTERNAL ... - все в одном можно выкрутить. Начиная с ФБ 2.5
10 май 18, 11:24    [21399395]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6000
akrush,

Path_to_Intalled_FB_Server\doc\sql.extensions\README.execute_statement2.txt
10 май 18, 11:27    [21399409]     Ответить | Цитировать Сообщить модератору
 Re: Битовые значения.  [new]
Polesov
Member

Откуда:
Сообщений: 492
akrush
Использую Delphi XE2
Подскажите как правильно получить десятичное число из битового поля.


val:=661662;    // 0000 0000 0000 1010 0001 1000 1001 1110

// data:= получить из val биты с 0 по 15
// 0000 0000 0000 1010 0001 1000 1001 1110
  data := val and $0000FFFF;

// spec:= получить из val биты с 16 по 23
// 0000 0000 0000 1010 0001 1000 1001 1110
  spec:= ( val shr 16 ) and $000000FF;

// calc:= получить из val бит 24
// 0000 0000 0000 1010 0001 1000 1001 1110
  calc:= ( val shr 24 ) and $00000001;

С уважением, Polesov.
10 май 18, 22:30    [21401367]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить