Вопросы по ООП в MQL5 - страница 93

 
Igor Makanu:

а такой еще вопрос... а можно каким-нибудь способом 12 битный int получить через union ? ... не суть через как )))

ЗЫ: в идеале 9-15 битный int , знак выделить не проблема, т.е. можно unsigned int   (в последних билдах MQL научился unsigned int , можно вместо uint использовать )

в общем опять не разобрался...хелп!хелп! )))

прикинул, что выделить часть необходимых битов могу так:

//+------------------------------------------------------------------+
uint ConvertUintToXBits(const uint value, const int pos, const int cnt_bits)
{
   uint mask = (0xFFFFFFFF >> (sizeof(uint) - cnt_bits)) << pos;  // получили битовую маску
   uint result = value & mask;                                    // выделили биты числа
   return(result >> pos);                                         // сдвинули чтобы привести к 32-битам
}
//+------------------------------------------------------------------+

где теперь будет находиться старший бит, чтобы знак числа определить... не знаю, т.е. в идеале это должна быть функция 

int ConvertUintToXBits(const uint value, const int pos, const int cnt_bits)

в идеале вообще нужен шаблон, чтобы такие структуры использовать:

struct Int12
{
private:
   const int bits;
public:
   Int12(const uint IntValue): bits(12) {ConvertUintToXBits.......}
   int value;
};
 
Igor Makanu:

в общем опять не разобрался...хелп!хелп! )))

прикинул, что выделить часть необходимых битов могу так:

где теперь будет находиться старший бит, чтобы знак числа определить... не знаю, т.е. в идеале это должна быть функция 

в идеале вообще нужен шаблон, чтобы такие структуры использовать:

Смотри. Маска - это значимая часть числа, то есть, для int, надо на бит дальше смещать, т.к. старший бит у тебя знак означает. <<pos - это лажа. Как у тебя, ты по этой маске старшие биты int брать будешь, а тебе нужны младшие))).

Для знаковых целых, надо отдельно значимую часть брать, отдельно старший бит (знак), смещать старший бит на нужную позицию и побитовым ИЛИ совмещать. Пример для int-> 4 бита

int mean4=0xFFFFFFFF>>29

int sign16=1<<31

int sign4=1<<3

Теперь int->int4 смотри за руками:

1. Имеем int val

2. int sign=(val&sign16)>>28

    Здесь мы взяли знак нашего числа и сместили в нужную нам позицию (старший бит в int4)

3. mean3val=val&mean4

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

4. int out=sign|mean3val

    А тут мы совместили знак со значимой частью. Теперь мы имеем 4 младших бита, в которых бит 4 - это знак, а биты 1..3 значимая часть, все биты старше 4-х имеют значение 0. Диапазон значений -8..7 И да, если на вход подать 8, то 7 не будет, а будет 0, так как все просто обрежется.

 

Проще сдвинуть на нужное количество битов, а за маску использовать 1. По крайней мере наглядней.

Определение знака: (a>>31)&1 - если 1, то минус, если 0, то плюс.

 

выделить из int значимые биты я могу решением в "лоб", а вот сделать универсальное решение... да не могу!  (((

высока вероятность, что не объяснил как и куда хочу

есть 4 байта int / uint, и есть мой набор данных, которые хочу запаковать распаковать в оптимизаторе

предположим, что у меня получилось так запаковать:

0-8 9-16 17-24 25-32
int_11  int_9  int_12

 какие типы мне нужны int_XXX я еще не прикидывал

но хочу иметь удобство использования в виде такого кода

input int param1 = 0xFFFFFFF;
int MyParam_1 = ConVertUintToIntXXX((uint)param1, 0, 11);
int MyParam_2 = ConVertUintToIntXXX((uint)param1, 12, 9);
int MyParam_3 = ConVertUintToIntXXX((uint)param1, 21,12);
 

А что, ошибку у меня никто не нашел еще?))))

Подсказываю: uint все маски должны быть)))

 
Igor Makanu:

выделить из int значимые биты я могу решением в "лоб", а вот сделать универсальное решение... да не могу!  (((

высока вероятность, что не объяснил как и куда хочу

есть 4 байта int / uint, и есть мой набор данных, которые хочу запаковать распаковать в оптимизаторе

предположим, что у меня получилось так запаковать:

0-8 9-16 17-24 25-32
int_11  int_9  int_12

 какие типы мне нужны int_XXX я еще не прикидывал

но хочу иметь удобство использования в виде такого кода

int add(int o,int l,int v,int r){
   int m=(int)MathPow(2,l)-1;
   r=~r;   
   r=r|(m<<o);
   r=~r;
   r=r|(v<<o);
   return(r);
}

int extract(int o,int l,int r){
   int m=(int)MathPow(2,l)-1;
   return((r>>o)&m);
}

o - отступ (битов), l - длина (количество битов), добавляемое значение, r - куда добавляем

Но особо не проверял.

 
Dmitry Fedoseev:

Because you are not overriding a virtual function, you are using overloading.


Тут явно что-то не так

 
Alexandr Andreev:

Тут явно что-то не так

Сделай метод шаблоном и получи к нему доступ

class A {
template<typename T>
void f( T ) {}
};
void OnStart()
{
        A а;
        а.f(0); //нормально
}
 
A100:

Сделай метод шаблоном и получи к нему доступ

Да это же лайфхак!!! 

ps: +1 способ написать то, что с обновлением просто перестанет работать, когда подправят этот лафхак

 
Alexandr Andreev:

Да это же лайфхак!!! 

ps: +1 способ написать то, что с обновлением просто перестанет работать, когда подправят этот лафхак

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
на фоне таких пробелов весьма странной выглядит битва за наносекунды
Причина обращения: