ну есть решение даже для любителей все делать через жопу: Код (Text): // Returns XOR of x and y int myXOR(int x, int y) { int res = 0; // Initialize result // Assuming 32-bit Integer for (int i = 31; i >= 0; i--) { // Find current bits in x and y bool b1 = x & (1 << i); bool b2 = y & (1 << i); // If both are 1 then 0 else xor is same as OR bool xoredBit = (b1 & b2) ? 0 : (b1 | b2); // Update result res <<= 1; res |= xoredBit; } return res; }
Rel, Вы просто не умеете их готовить [math]A\oplus B = (A\; or\; B)-(A\; and\; B)[/math] [math]A\oplus B = (A + B)-((A \;and\; B)\ll 1)[/math] [math]A\oplus B =((A\; or\; B)\ll 1) - (A + B)[/math] [math]A\oplus B = (A - B) + ((\bar{A} \;and \;B)\ll 1)[/math] [math]A\oplus B = ((A\; and\; \bar{B})\ll 1) - (A - B)[/math]
Mikl___, Можно переносить части выражений с приравниванием, те как с обычной математикой ? Тоесть как это сделать ? Может матчасть по этому имеется ? Зависли несколько тем по ацп выражениям.
Любое выражение, где (0,0)=0, (1,1)=0, (1,0)=1, (0,1)=1 справедливо, будет заменой хора, но только для одного бита.
Сумма это когда иногда есть переносы в старшие разряды, а логические функции не любят неопределенность.
Уоррен, Генри С. "Алгоритмические трюки для программистов" издание 2014. Подойдет? Книга лежит в wasm.in --> Ресурсы Подставьте вместо А и В любые числа и проверьте Да, можно. Там смесь из логических (or, and, not, shl) и арифметических (+, -) операций
Mikl___, https://wasm.in/threads/svjortka-bulevyx-funkcij.33283/ Может найду что по теме. Выше выражения раскрываются в функции, где несколько операций с каждой переменной, те усложняются. Пока не ясно что с этими выражениями делать, нужно матчасть почитать. Ксор со сложением странно выглядит в виде мат выражения Вот тут есчо похожее https://exelab.ru/f/index.php?action=vthread&forum=7&topic=25876 (~n & w) | (n&(w-1)) Как это выражение преобразовать по формулам. Формулы выше так понимаю не из логики ?
логическая [math]A\;or\;B=(A\;and\;B)+(A\oplus B)[/math] просто нет разрядов, которые при сложении образуют переносы Сложение чисел A и B в несколько этапов арифметическая [math]A+B=(A\oplus B)+((A\;and\;B)\ll 1)[/math] На уровне логических вентилей сложение сводится к получению частичной суммы [math]A\oplus B[/math] и разрядов переноса [math](A\;and\;B)\ll 1[/math], из частичной суммы и разрядов переноса будет сформирована новая частичная сумма и новые разряды переноса и так далее. Процесс будет продолжаться до тех пор, пока либо частичная сумма, либо разряды переноса не станут равными нулю. Если числа A и B равны, то мы получим удвоение числа A на первом шаге. Вычитание чисел A и B произойдет аналогично сложению с той только разницей, что значение B будет заменено на дополнительный к нему код.
Mikl___, Так куда понятнее, символ сложения одинаковый для OR и ADD. Тоесть это не аналого-цифровые выражения получается, однобитная математика ?
Там, где можно не учитывать перенос ― это уже можно перенести на многобитную логику Из [math]A\;or\;B=(A\;and\;B)+(A\oplus B)[/math] можем получить [math]A\;and\;B=(A\;or\;B)-(A\oplus B)[/math] и [math]A\oplus B=(A\;or\;B)-(A\;and\;B)[/math] Это всё проверяется на встроенном Windows-калькуляторе
Indy_, посмотри на линейную первичную перестановку шифра serpent и ее эффективную реализацию. Может вот этот док наведет на какие-нибудь мысли (конец документа). https://eprint.iacr.org/2014/453.pdf что бы не возиться с конкретными словами можно посмотреть в сторону вычислений на матрицах.
Indy_, похоже на мультиплексорную операцию, в зависимости от значения [math]n[/math] пропускается либо [math]w[/math], либо ([math]w-1[/math]) а еще это if n then (w-1) else w или n ? (w-1) : w
А по-моему не похоже. В контексте было сказано что это из merkle tree, надо понимать пассажир декомпилил биткоен-майнера. В исходниках биткоена единственное более-менее похожее на это: Код (Text): uint32_t inline f2(uint32_t x, uint32_t y, uint32_t z) { return (x & y) | (~x & z); } И это тупо ripemd160, алгоритм хеширования.