LINUX.ORG.RU
ФорумTalks

[Вещества] Можно ли выразить всю математику только через битовые операции?

 


0

2

Дано: <<, >>, |<<, >>| (типа циклические сдвиги), ~, &, |, ^.

Можно ли выразить все математические операции типа +, -, *, / через битовые операции?

Тред о веществах, поэтому в Talks.

И да, я использую Linux.

Ответ на: комментарий от Deleted

franchukroman

В брейнфаке битовых операций нет вообще: там есть только +-

почему же? + - это тоже битовые операции, главное диапазон входных данных.

drBatty ★★
()
Ответ на: комментарий от drBatty

да... Настоящая и Ъ жена === девственница. То, что она работала 10 лет на трассе делая минет и даваясь в задницу - в принципе мелочь: девственная плева-то цела! Операции по восстановлению мы тоже не учитываем, хотя стоят они не так уж и дорого...

Я уверен, что «чистого» решения без рекурсии, итерации или дублирования не существует :)

Deleted
()

Не «можно», а давно сделано. man машина Тьюринга, конечные автоматы и ПК как наглядный пример.

segfault ★★★★★
()
Ответ на: комментарий от drBatty

Или рассказывай, как в твоём CPU вызов функции реализован без декремента.

допустим так,

mov r0, instruction_pointer
jump func_label
:)

для следующего уровня вложенности сохраняем адрес возврата в следующем регистре, пока они не кончатся :)

Harald ★★★★★
()

что-то я такое проходил в универе, типа все вычисления можно реализовать на базисе из 3 любых булевых функций

Harald ★★★★★
()
Ответ на: комментарий от drBatty

Вроде в описании языка не оговорено, но де-факто все реализуют брейнфак на целых числах. Конечно, при условии, что диапазон целых чисел - от 0 до 2^n - 1, то стандартные битовые операции можно реализовать при помощи + и -, но сами + и - таковыми не являются.

Deleted
()
Ответ на: комментарий от Deleted

franchukroman

Я уверен, что «чистого» решения без рекурсии, итерации или дублирования не существует :)

оно существует, но нам понадобится хотя-бы маленькое простейшее ALU, которое будет заниматься циклами и тому подобным. Да, ты прав, можно использовать стек, только это не решение задачи. И конечно это ALU вполне можно построить на простейших логических вентилях и-не, или или-не. Как и всё остальное.
Чистое решение конечно тоже существует, но его действительно долго расписывать.

drBatty ★★
()
Ответ на: комментарий от Harald

Harald

для следующего уровня вложенности сохраняем адрес возврата в следующем регистре, пока они не кончатся :)

имелся ввиду рекурсивный вызов одной функции. Неизвестно сколько раз. В данном случае например 32 раза, причём понятно, что 32х ненужных регистров у нас физически нет.

drBatty ★★
()
Ответ на: комментарий от Harald

Harald

что-то я такое проходил в универе, типа все вычисления можно реализовать на базисе из 3 любых булевых функций

из двух. Одна из них инверсия.

drBatty ★★
()
Ответ на: комментарий от Deleted

franchukroman

Вроде в описании языка не оговорено, но де-факто все реализуют брейнфак на целых числах. Конечно, при условии, что диапазон целых чисел - от 0 до 2^n - 1, то стандартные битовые операции можно реализовать при помощи + и -, но сами + и - таковыми не являются.

всегда можно отфильтровать младший бит, хотя в случае brainfuck'а это будет довольно сложно.

drBatty ★★
()
def inc(a):
    m=a^(-1) and 1
    while a&m^(m>>1): m=m<<1|1
    return m and a^m

def add(a,b):
    while b: a,b=inc(a),-inc(-b)
    return a

def div(a,b):
    r=-1
    while a>=0: a,r=-add(-a,b),inc(r)
    return r
alfix
()
Ответ на: комментарий от Deleted

Только если у нас будет еще if (или тернарный оператор или другое средство)

B&a | C&!a (если a — однобитное) совсем не подойдёт что ли?

Yareg ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.