MQL5中的OOP问题 - 页 93

 
Igor Makanu:

另一个问题...有什么方法可以通过union获得12位int吗?不要紧,))))

SZY:最好是9-15位的int,符号分配不是问题,也就是说可以用无符号int(在MQL的最后一个版本中学习了无符号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 is a mess.在你的例子中,你将通过这个掩码获取int的高位,而你需要低位)))。

对于有符号的整数,你必须分别取有效部分,分别取高位(符号),然后将高位移到需要的位置,并使用位法OR将它们合并。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:

因为你没有覆盖一个虚拟函数,你使用的是重载。


这里显然有问题

 
Alexandr Andreev:

这里显然有问题。

使该方法成为一个模板,并访问它

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

使该方法成为一个模板,并访问它

那是一个laifhack!!!。

ps:+1写东西的方法,当他们调整这个loafhack时,就会随着更新而停止工作。

 
Alexandr Andreev:

这是个漏洞!!!。

ps:+1写东西的方法,当他们调整这个loafhack时,就会随着更新而停止工作。

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
在这样的差距下,纳秒之争 看起来很奇怪