где ^ - возведение в степень, для двоичной системы заменяется сдвиговыми операциями << (к примеру если есть число 467 и тебе его нужно умножить на 10, ты же не будешь его реально умножать, а просто дорисуешь нолик, в двоичной системе все аналогично, а сдвиг это очень быстрая операция)
Вы прежде чем советы раздавать, в документацию гляньте.
Побитовая операция исключающее ИЛИ (eXclusive OR) двоичных представлений x и
y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные
двоичные значения, и 0 - во всех остальных разрядах.
b = x ^ y;
XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.
посиди с бумажкой и ручкой переводя числа в двоичную систему и обратно и все получится, успехов в изучении.
PapaYozh писал(а)>>
Вы прежде чем советы раздавать, в документацию гляньте.XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.Пальцы, пальцы не растопыривайте!
^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.
^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.
Угу.
Человек пишет на MQL, причем только учится.
У него проблема, в решении которой он попросил помочь.
Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.
Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.
На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.
PapaYozh>>:
Вы прежде чем советы раздавать, в документацию гляньте.XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.Пальцы, пальцы не растопыривайте!
папочка, остынь. Как раз перед написанием заглянул в https://www.mql5.com/ru/docs/basis/operations/bit
Я имел в виду именно то что написано, написанный пример не будет работать ни на одном языке программирования, но достаточно лаконично отражает суть. ^ - это возведение в степень, если бы я использовал в примере сдвиги он бы несколько вырос, хотя был бы полностью рабочим но не так объяснял суть.
int z=1;
На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.
Перебор
всех возможных вариантов значений массива, мне нужен не для алгебры, а для
последующих операций сравнения других данных. а каждый элемент массива с 0 и 1,
это будет означать учитывать мне тот или иной элемент в другом массиве или
можно значениями данного элемента пренебречь.
В общем, что-то вроде этого, но это лишь сравнительно небольшой участок
кода, до которого я сам не смог додуматься. Спасибо всем за представленные
варианты, освободится немного времени и буду все тестировать!
Тему думаю закрывать не нужно вдруг надо будет еще что-то спросить, так что
буду благодарен всем за помощь! Если что-то выйдет толковое с задуманным
скриптом, обещаю поделиться! Всем спасибо.
Наконец нашел время разобраться с предоставленными для меня решениями моей задачи, немного изменил код под mql5, вот выкладываю, возможно кому-нибудь пригодится:
Решение задачи реализовал в качестве скрипта для mt5.
voidOnStart()
{
//---int indx,l;
int arr[20];// массив.bool quit=true;// переменная для цикла whileint maxraz=6;// максимальный размер массива для перебора всех вариантов от 0 до 1int minraz=4;// минимальный размер массива для перебора всех вариантов от 0 до 1for (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);//Перебраны все варианты (или сделано последнее изменение)elsereturn(0);//Есть еще варианты, перебор не окончен.
}
else
{
return(1);//Перебраны все варианты!
}
}
Еще раз благодарю PapaYozh за предоставленную помощь! *Минимальный размер массива для перебора должен быть больше или равен 3.
где ^ - возведение в степень, для двоичной системы заменяется сдвиговыми операциями << (к примеру если есть число 467 и тебе его нужно умножить на 10, ты же не будешь его реально умножать, а просто дорисуешь нолик, в двоичной системе все аналогично, а сдвиг это очень быстрая операция)
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.
посиди с бумажкой и ручкой переводя числа в двоичную систему и обратно и все получится, успехов в изучении.
Вы прежде чем советы раздавать, в документацию гляньте.XOR - никакой не сдвиг, и результат будет совсем иной, чем тот, о котором спрашивал Fast.
----
Если Вы не имели ввиду операцию "^", а подразумевали "<<", то и в этом случае Ваш пример не рабочий, т.к. в конечном итоге массив заполнится степенями двойки.Пальцы, пальцы не растопыривайте!
^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.
^ - классическое обозначение операции возведения в степень (например, в visual basic 6). Возведение в степень в двоичной системе исчисления - сдвиг влево. Так что ваше замечание не к месту.
Угу.
Человек пишет на MQL, причем только учится.
У него проблема, в решении которой он попросил помочь.
Ему дают код
for(int a=0;a<(MaxIndx-MinIndx)-2;a++)
arr[MinIndx+1+a]=i&(2^a);
Который:
а) оказывается не на MQL;
б) даже если "^" заменить на "<<" не станет работать так, как просил топикстартер.
---
А моё замечание, оно, конечно, не к месту.
Извините, что понтоваться мешаю.
Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.
Мне вот только интересно. Массивы то зачем. Двоичное кодирование полностью снимает проблему. Одно число, которое можно преобразовать в двоичный вид. Эта мысль звучала здесь уже не раз. И говорили об этом разные люди. Может довольно заваулировано конечно. Но смысл тот же.
На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.
Вы прежде чем советы раздавать, в документацию гляньте.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;}
На этот вопрос никто кроме топикстартера ответить не сможет. Может быть там какая-нибудь матричная алгебра интенсивно используется.
В общем, что-то вроде этого, но это лишь сравнительно небольшой участок кода, до которого я сам не смог додуматься. Спасибо всем за представленные варианты, освободится немного времени и буду все тестировать!
Тему думаю закрывать не нужно вдруг надо будет еще что-то спросить, так что буду благодарен всем за помощь! Если что-то выйдет толковое с задуманным скриптом, обещаю поделиться! Всем спасибо.
Решение задачи реализовал в качестве скрипта для mt5.
Главная функция OnStart()
Функция, с помощью которой осуществляем перебор _F1()
Еще раз благодарю PapaYozh за предоставленную помощь!
*Минимальный размер массива для перебора должен быть больше или равен 3.