MQL5의 OOP에 대한 질문 - 페이지 93

 
Igor Makanu :

그리고 여전히 그러한 질문은 ... 어떤 식 으로든 Union을 통해 12 비트 int를 수신하는 것이 가능합니까? ... 방법의 본질이 아님)))

추신: 이상적으로는 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의 경우 조금 더 이동할 필요가 있습니다. 왜냐하면 기호의 가장 중요한 비트를 의미합니다. <<포스는 꽝입니다. 당신과 마찬가지로 이 마스크를 사용하여 int의 상위 비트를 사용하지만 하위 비트))))가 필요합니다.

부호 있는 정수의 경우 중요 부분을 별도로 취하여 최상위 비트(부호)를 별도로 취하고 최상위 비트를 원하는 위치로 이동하고 비트 OR을 결합해야 합니다. int->4비트의 예

정수 평균4=0xFFFFFFFF>>29

정수 기호16=1<<31

정수 기호4=1<<3

이제 int->int4 손을 조심하십시오.

1. 우리는 int val이 있습니다

2. 정수 기호=(val&sign16)>>28

여기서 숫자의 부호를 가져와 필요한 위치로 이동했습니다(int4의 가장 높은 비트).

3.mean3val=val&mean4

여기서 우리는 마스크를 통해 세 개의 최하위 비트(중요한 부분)를 얻었고 나머지는 모두 잘렸습니다.

4. int out=sign|mean3val

그리고 여기서 우리는 기호와 중요한 부분을 결합했습니다. 이제 비트 4가 부호이고 비트 1..3이 중요한 부분인 4개의 최하위 비트가 있습니다. 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 정수_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 );
 

뭐, 아무도 내 실수를 아직 찾지 못했나요?))))

나는 제안한다: 모든 마스크는 다음과 같아야 한다)))

 
Igor Makanu :

정면 솔루션을 사용하여 int에서 중요한 비트를 추출할 수 있지만 보편적인 솔루션을 만들 수는 있지만 ... 할 수 없습니다! (((

그가 내가 원하는 방법과 장소를 설명하지 않았을 가능성이 큽니다.

4 int / uint 바이트가 있고 옵티마이저에서 압축 을 풀고 싶은 데이터 세트가 있습니다.

다음과 같이 포장했다고 가정해 보겠습니다.

0-8 9-16 17-24 25-32
int_11 정수_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 :

메서드를 템플릿으로 만들고 액세스

네, 이것은 해킹입니다!!!

추신: 이 라이프 핵이 수정되면 업데이트 작업을 중지할 무언가를 작성하는 +1 방법

 
Alexandr Andreev :

네, 이것은 해킹입니다!!!

추신: 이 라이프 핵이 수정되면 업데이트 작업을 중지할 무언가를 작성하는 +1 방법

 class A {
public :
void f( int ) {}
};
class B : public A {
public:
template < typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } // нормально
};
이러한 격차를 배경으로 나노초의 싸움 은 매우 이상해 보입니다.