Уважаемые знатоки Mql4 и Mql5, есть вопросик насчет реализации алгоритма... - страница 4

 
splxgf >>:

где ^ - возведение в степень, для двоичной системы заменяется сдвиговыми операциями << (к примеру если есть число 467 и тебе его нужно умножить на 10, ты же не будешь его реально умножать, а просто дорисуешь нолик, в двоичной системе все аналогично, а сдвиг это очень быстрая операция)
Вы прежде чем советы раздавать, в документацию гляньте.
Побитовая операция исключающее ИЛИ (eXclusive OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.
b = x ^ y;
XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.

посиди с бумажкой и ручкой переводя числа в двоичную систему и обратно и все получится, успехов в изучении.
Пальцы, пальцы не растопыривайте!
 
PapaYozh писал(а) >>
Вы прежде чем советы раздавать, в документацию гляньте.XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.Пальцы, пальцы не растопыривайте!



^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.
 
lea >>:



^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.

Угу.

Человек пишет на MQL, причем только учится.

У него проблема, в решении которой он попросил помочь.

Ему дают код

for(int a=0;a<(MaxIndx-MinIndx)-2;a++)
arr[MinIndx+1+a]=i&(2^a);

Который:

а) оказывается не на MQL;

б) даже если "^" заменить на "<<" не станет работать так, как просил топикстартер.

---

А моё замечание, оно, конечно, не к месту.

Извините, что понтоваться мешаю.

 

Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.

 
Vinin >>:

Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.

На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.

 
PapaYozh >>:
Вы прежде чем советы раздавать, в документацию гляньте.XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.Пальцы, пальцы не растопыривайте!

папочка, остынь. Как раз перед написанием заглянул в https://www.mql5.com/ru/docs/basis/operations/bit

Я имел в виду именно то что написано, написанный пример не будет работать ни на одном языке программирования, но достаточно лаконично отражает суть. ^ - это возведение в степень, если бы я использовал в примере сдвиги он бы несколько вырос, хотя был бы полностью рабочим но не так объяснял суть.
int z=1;

for(int a=0;a<(MaxIndx-MinIndx)-2;a++){
arr[MinIndx+1+a]=i&z;

z=z<<1;}

P.S. насчет заполнения степенями действительно лажанулся, лечится ?: или немного другим вариантом

for(int a=0;a<(MaxIndx-MinIndx)-2;a++){

arr[MinIndx+1+a]=i&1;

a=a>>1;}

 
PapaYozh >>:

На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.

Перебор всех возможных вариантов значений массива, мне нужен не для алгебры, а для последующих операций сравнения других данных. а каждый элемент массива с 0 и 1, это будет означать учитывать мне тот или иной элемент в другом массиве или можно значениями данного элемента пренебречь.
В общем, что-то вроде этого, но это лишь сравнительно небольшой участок кода, до которого я сам не смог додуматься. Спасибо всем за представленные варианты, освободится немного времени и буду все тестировать!
Тему думаю закрывать не нужно вдруг надо будет еще что-то спросить, так что буду благодарен всем за помощь! Если что-то выйдет толковое с задуманным скриптом, обещаю поделиться! Всем спасибо.
 
Наконец нашел время разобраться с предоставленными для меня решениями моей задачи, немного изменил код под mql5, вот выкладываю, возможно кому-нибудь пригодится:
Решение задачи реализовал в качестве скрипта для mt5.

Главная функция OnStart()
void OnStart()
  {
//---

   int indx,l;
   int arr[20];// массив.
   bool quit=true;// переменная для цикла while
   int maxraz=6;// максимальный размер массива для перебора всех вариантов от 0 до 1
   int minraz=4;// минимальный размер массива для перебора всех вариантов от 0 до 1
   for (l=minraz;l<=maxraz;l++)
   {
     indx=0;
     quit=true;
     Print("+-----------------------+");
     while (quit)
     {
       if (_F1(indx,arr,l-2)==1) quit=false;
       Print("Вариант ",indx);
     }
   }  
Print("======================================================================");
  }


  Функция, с помощью которой осуществляем перебор _F1()
int _F1(int &indx, int &mass[], double cnt)
{
   
   int i1;
   string str;
   int variant;
   variant=pow(2,cnt);
   if (indx<variant-1)
   {
     indx++;
     int count=cnt;
     for( i1=0; i1<count; i1++ )
     {
        mass[i1+1] = ( indx >> i1 ) & 1;
     }
     mass[0] = 0;
     mass[count+1] = 0;
      
     // массив заполнен, проверим это
     str="";
     for( i1=0; i1<=count+1; i1++ )
     StringAdd(str,IntegerToString(mass[i1]));
     Print("mass: ",str);

     if (indx>=variant-1)
     return(1);//Перебраны все варианты (или сделано последнее изменение)
     else return(0);//Есть еще варианты, перебор не окончен.
   }
   else
   {
     return(1);//Перебраны все варианты!
   }
}

Еще раз благодарю PapaYozh за предоставленную помощь!
*Минимальный размер массива для перебора должен быть больше или равен 3.