Здравствуйте, LiIon, Вы писали:
LI>Здравствуйте, dikun, Вы писали:
D>>...для однобайтовых чисел:
D>>x[k](2) ::= k-я цифра числа x в двоичной системе счисления D>>x[n]...x[0]( 2) ::= x, записанное двоичными цифрами. D>>x[m]...x[0](10) ::= x, записанное десятичными цифрами. D>>sum[i=0,7](a[i](2)) ::= сумма по i от 0 до 7 двоичных a[i]-ых D>>2^i ::= 2 в степени i D>>a shl i ::= побитный сдвиг a влево на i бит без усечения битов, вышедших за разрядную сетку D>>a shr i ::= аналогично предыдущему (только вправо и с усечением) D>>a div b ::= неполное частное при делении a на b
D>>not a = 1...1(2) — a = 255(10) — a D>>a shl i = a * (2^i) D>>a shr i = a div (2^i) D>>a[i](2) = ( ( a shl (7-i) ) — ( ( a shr (i+1) ) shl 8 ) ) shr 7 D>>a and b = sum[i=0,7]( a[i](2) * b[i](2) * (2^i) ) D>>a or b = not( (not a) and (not b) ) D>>not(not a) = a D>>a => b = (not a) or b = not( a and (not b) ) D>>a <=> b = (a => b) and (b => a) D>>a xor b = not(a <=> b) = not( (a=>b) and (b=>a) ) = not( not( a and (not b) ) and not( b and (not a) ) )
D>>Всё. D>>Если есть желание — преобразовывай дальше.
LI>В том то и дело что побитово я могу это все разложить и преобразовать через другие побитовые операции, но совместить побитовые операции с арифметическими действиями у меня не получается, т.е. можно ли преобразовать такую формулу (a or (not(b-c)), где '-' арифметическое действие, через арифметические действия а не через побитовые. Или как арифметический '-' выразить побитовыми функциями.
Тут мне стало интересно: а зачем
как выразить конъюнкцию через арифметические действия
Здравствуйте, LiIon, Вы писали:
LI>Помогите чайнику! LI>Нужно выразить основные булевые функции(and, or, xor, not) через арифметические действия.
Если true = 1, а false = 0 то:
a and b = min(a, b)
a or b = max(a, b)
not a = 1 — a
xor соответственно выражаешь через эти три
С другой стороны если пользоваться булевой алгеброй, то x + x = 0, x*x = x и воспользовавшись правилом разложения булевой функции в булевый многочлен получаем:
not x = x + 1
x1 xor x2 = x1 + x2
x1 or x2 = x1*x2+x1+x2
x1 and x2 = x1*x2
Re: как выразить конъюнкцию через арифметические действия
Здравствуйте, LiIon, Вы писали:
LI>Помогите чайнику! LI>Нужно выразить основные булевые функции(and, or, xor, not) через арифметические действия.
and='*'; or='+'; xor='-'; not='*(-1)(+/-)'
Re[2]: как выразить конъюнкцию через арифметические действия
От:
Аноним
Дата:
10.03.05 10:05
Оценка:
Здравствуйте, Reunion, Вы писали:
R>Здравствуйте, LiIon, Вы писали:
LI>>Помогите чайнику! LI>>Нужно выразить основные булевые функции(and, or, xor, not) через арифметические действия.
R>Если true = 1, а false = 0 то: R>a and b = min(a, b) R>a or b = max(a, b) R>not a = 1 — a R>xor соответственно выражаешь через эти три
R>С другой стороны если пользоваться булевой алгеброй, то x + x = 0, x*x = x и воспользовавшись правилом разложения булевой функции в булевый многочлен получаем: R>not x = x + 1 R>x1 xor x2 = x1 + x2 R>x1 or x2 = x1*x2+x1+x2 R>x1 and x2 = x1*x2
я извиняюсь, это подойдет если обрабатывать каждое число по битам, может я не правильно в начале выразился, мне нужен алгоритм для представления например (X and (Y or Z)), где X,Y,Z любые произвольные числа.
Re[2]: как выразить конъюнкцию через арифметические действия
Здравствуйте, EastMan, Вы писали:
EM>Здравствуйте, LiIon, Вы писали:
LI>>Помогите чайнику! LI>>Нужно выразить основные булевые функции(and, or, xor, not) через арифметические действия. EM>and='*'; or='+'; xor='-'; not='*(-1)(+/-)'
я понимаю что and можно записать как '*' но при обработке получается:
1101 and 1001 = 1001
1101 * 1001 = 1110101
1101 or 1001 = 1101
1101 — 1001 = 0100
а мне нужен алгоритм который бы считал булевые функции арифметическими действиями или наоборот
Re[3]: как выразить конъюнкцию через арифметические действия
Здравствуйте, <Аноним>, Вы писали:
А>я извиняюсь, это подойдет если обрабатывать каждое число по битам, может я не правильно в начале выразился, мне нужен алгоритм для представления например (X and (Y or Z)), где X,Y,Z любые произвольные числа.
Простите, а что Вы под этим подразумеваете?
Есть and,or логические, над булевым типом — тогда при чем здесь произвольные числа?
С другой стороны, есть побитовые операции над числами
А вы о каких?
... << RSDN@Home 1.1.3 stable >>
Re[4]: как выразить конъюнкцию через арифметические действия
Здравствуйте, Chamele0n, Вы писали:
C>Здравствуйте, <Аноним>, Вы писали:
А>>я извиняюсь, это подойдет если обрабатывать каждое число по битам, может я не правильно в начале выразился, мне нужен алгоритм для представления например (X and (Y or Z)), где X,Y,Z любые произвольные числа.
C>Простите, а что Вы под этим подразумеваете? C>Есть and,or логические, над булевым типом — тогда при чем здесь произвольные числа? C>С другой стороны, есть побитовые операции над числами C>А вы о каких?
я ж говорю что я чайник, мне именно и нужны побитовые операции над числами, просто хочу узнать есть ли возможность числа обрабатывать не побитово, а целиком
Re[3]: как выразить конъюнкцию через арифметические действия
Здравствуйте, LiIon, Вы писали:
LI>1101 and 1001 = 1001 LI>1101 * 1001 = 1110101
LI>1101 or 1001 = 1101 LI>1101 — 1001 = 0100
LI>а мне нужен алгоритм который бы считал булевые функции арифметическими действиями или наоборот
У тебя неправильная терминология — из-за этого и путаница. Тебе нужны не булевы функции а битовые операции.
Re[4]: как выразить конъюнкцию через арифметические действия
Здравствуйте, Nose, Вы писали:
N>Здравствуйте, LiIon, Вы писали:
LI>>1101 and 1001 = 1001 LI>>1101 * 1001 = 1110101
LI>>1101 or 1001 = 1101 LI>>1101 — 1001 = 0100
LI>>а мне нужен алгоритм который бы считал булевые функции арифметическими действиями или наоборот
N>У тебя неправильная терминология — из-за этого и путаница. Тебе нужны не булевы функции а битовые операции.
я ж и говорю, что я чайник, и в терминологии как выяснилось такойже
Re[5]: как выразить конъюнкцию через арифметические действия
Здравствуйте, LiIon, Вы писали:
LI>Здравствуйте, Nose, Вы писали:
N>>Здравствуйте, LiIon, Вы писали:
LI>>>1101 and 1001 = 1001 LI>>>1101 * 1001 = 1110101
LI>>>1101 or 1001 = 1101 LI>>>1101 — 1001 = 0100
LI>>>а мне нужен алгоритм который бы считал булевые функции арифметическими действиями или наоборот
N>>У тебя неправильная терминология — из-за этого и путаница. Тебе нужны не булевы функции а битовые операции.
LI>я ж и говорю, что я чайник, и в терминологии как выяснилось такойже
Дык и в С/С++ и в Pascal/Delphi есть эти операции: (and, or, not, xor) в в Pascal/Delphi и (&, |, !, ^) соответственно в С/С++...
Здравствуйте, LiIon, Вы писали:
LI>Нужно выразить основные булевые функции(and, or, xor, not) через арифметические действия.
...для однобайтовых чисел:
x[k](2) ::= k-я цифра числа x в двоичной системе счисления
x[n]...x[0]( 2) ::= x, записанное двоичными цифрами.
x[m]...x[0](10) ::= x, записанное десятичными цифрами.
sum[i=0,7](a[i](2)) ::= сумма по i от 0 до 7 двоичных a[i]-ых
2^i ::= 2 в степени i
a shl i ::= побитный сдвиг a влево на i бит без усечения битов, вышедших за разрядную сетку
a shr i ::= аналогично предыдущему (только вправо и с усечением)
a div b ::= неполное частное при делении a на b
not a = 1...1(2) — a = 255(10) — a a shl i = a * (2^i) a shr i = a div (2^i) a[i](2) = ( ( a shl (7-i) ) — ( ( a shr (i+1) ) shl 8 ) ) shr 7 a and b = sum[i=0,7]( a[i](2) * b[i](2) * (2^i) ) a or b = not( (not a) and (not b) )
not(not a) = a
a => b = (not a) or b = not( a and (not b) )
a <=> b = (a => b) and (b => a) a xor b = not(a <=> b) = not( (a=>b) and (b=>a) ) = not( not( a and (not b) ) and not( b and (not a) ) )
Здравствуйте, dikun, Вы писали:
D>...для однобайтовых чисел:
D>x[k](2) ::= k-я цифра числа x в двоичной системе счисления D>x[n]...x[0]( 2) ::= x, записанное двоичными цифрами. D>x[m]...x[0](10) ::= x, записанное десятичными цифрами. D>sum[i=0,7](a[i](2)) ::= сумма по i от 0 до 7 двоичных a[i]-ых D>2^i ::= 2 в степени i D>a shl i ::= побитный сдвиг a влево на i бит без усечения битов, вышедших за разрядную сетку D>a shr i ::= аналогично предыдущему (только вправо и с усечением) D>a div b ::= неполное частное при делении a на b
D>not a = 1...1(2) — a = 255(10) — a D>a shl i = a * (2^i) D>a shr i = a div (2^i) D>a[i](2) = ( ( a shl (7-i) ) — ( ( a shr (i+1) ) shl 8 ) ) shr 7 D>a and b = sum[i=0,7]( a[i](2) * b[i](2) * (2^i) ) D>a or b = not( (not a) and (not b) ) D>not(not a) = a D>a => b = (not a) or b = not( a and (not b) ) D>a <=> b = (a => b) and (b => a) D>a xor b = not(a <=> b) = not( (a=>b) and (b=>a) ) = not( not( a and (not b) ) and not( b and (not a) ) )
D>Всё. D>Если есть желание — преобразовывай дальше.
В том то и дело что побитово я могу это все разложить и преобразовать через другие побитовые операции, но совместить побитовые операции с арифметическими действиями у меня не получается, т.е. можно ли преобразовать такую формулу (a or (not(b-c)), где '-' арифметическое действие, через арифметические действия а не через побитовые. Или как арифметический '-' выразить побитовыми функциями.
Re[6]: как выразить конъюнкцию через арифметические действия
Здравствуйте, Reunion, Вы писали:
R>Здравствуйте, LiIon, Вы писали:
LI>>Здравствуйте, Nose, Вы писали:
N>>>Здравствуйте, LiIon, Вы писали:
LI>>>>1101 and 1001 = 1001 LI>>>>1101 * 1001 = 1110101
LI>>>>1101 or 1001 = 1101 LI>>>>1101 — 1001 = 0100
LI>>>>а мне нужен алгоритм который бы считал булевые функции арифметическими действиями или наоборот
N>>>У тебя неправильная терминология — из-за этого и путаница. Тебе нужны не булевы функции а битовые операции.
LI>>я ж и говорю, что я чайник, и в терминологии как выяснилось такойже
R>Дык и в С/С++ и в Pascal/Delphi есть эти операции: (and, or, not, xor) в в Pascal/Delphi и (&, |, !, ^) соответственно в С/С++...
то что они есть в этих языках я знаю, но мне нужно избавиться в формуле от побитовых операций, т.е. выразить их через арифметические действия
Re[8]: как выразить конъюнкцию через арифметические действия
Здравствуйте, Reunion, Вы писали:
LI>>В том то и дело что побитово я могу это все разложить и преобразовать через другие побитовые операции, но совместить побитовые операции с арифметическими действиями у меня не получается, т.е. можно ли преобразовать такую формулу (a or (not(b-c)), где '-' арифметическое действие, через арифметические действия а не через побитовые. Или как арифметический '-' выразить побитовыми функциями.
R>Тут мне стало интересно: а зачем
даже не знаю что ответить, я стал писать небольшую прогу, и в ней есть выражение d = (a and (b-c)), и мне стало интересно, а можно ли из этой формулы выразить любой элемент через другие. А так как в ней присутствуют и побитовые и арифметические действия то у меня с этим возникли проблемы, вот я и задал вопрос, может кто с этим сталкивался уже.
Здравствуйте, LiIon, Вы писали:
LI>В том то и дело что побитово я могу это все разложить и преобразовать через другие побитовые операции, но совместить побитовые операции с арифметическими действиями у меня не получается
Стоп! Я выразил: not — через арифметическую разность.
and — через разность, сумму, shl и shr.
shl — через умножение и возведение в степень.
shr — через div и возведение в степень.
Значит, наш and выражается через арифметические разность, сумму, умножение, возведение в степень и div.
Нужно лишь подставить в формулу (и — если хочется — преобразовать — может чего хорошего и получиться).
Это элементраные каскадные математические преобразования.
or — через not и and, а значит — через арифметические разность, сумму, умножение, возведение в степень и div.
Снова просто подставь в формулу, блин!!!
xor — через not и and, а значит — через арифметические разность, сумму, умножение, возведение в степень и div. Подставь в формулу опять.
В чём проблема?
Я не понимаю!
Но у меня отсутствует желание упрощать выражения после подстановок.
Если не полениться, то может там чего красивого и получиться.
Я нигде не встречал этих упрощений, поэтому, возможно, их не имеет смысла проделывать, так как они не позволят получить значительной красоты упрощаемых выражений.