Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Вниз

Как выразить битовую операцию or с помощью сложения и умножения?   Найти похожие ветки 

 
Dmitry S ©   (2008-08-12 17:57) [0]

Нужно выполнить битовую операцию OR над двумя числами. Кроме операций сложения и умножения, других нет. Возможно ли?


 
Medbe}I{onok XML ©   (2008-08-12 18:04) [1]

а чем сам or не подошел?


 
vrem   (2008-08-12 18:04) [2]

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


 
tesseract ©   (2008-08-12 18:04) [3]

Or это или есть сложение правда побитовое.


 
Anatoly Podgoretsky ©   (2008-08-12 21:38) [4]

> Dmitry S  (12.08.2008 17:57:00)  [0]

Зачем?


 
sniknik ©   (2008-08-12 21:59) [5]

> Зачем?
из любви к искусству... искусству все делать через одно место, выбирая для этого самые неподходящие средства. (типа драйвера писать так на языке высокого уровня с большой степенью абстракции, а если базу данных так непременно самому, с нуля, и на ассемблере...)  

> а чем сам or не подошел?
так думаю, там где он это хочет применить его попросту нету... или не знает там такого оператора, и решил, что "сваять" велосипед проще чем изучить используемое.


 
vrem   (2008-08-12 22:34) [6]

спрашивая зачем вы желаете подсказать каким путём автору в его ситуации будет ближе дойти? или примеряете к автору способ "ну это же не тот путь, зачем ходят иначе" :)
Но, я думаю, если видна цель, то путь и ворота не нужны.


 
sniknik ©   (2008-08-12 23:13) [7]

Удалено модератором


 
Rouse_ ©   (2008-08-12 23:25) [8]

Firebird, например, не поддерживает битовые операции, так что нормальный вопрос :) Насколько мне известно - проблему обошли через UDF :)


 
Renegat ©   (2008-08-13 00:25) [9]

Сложение это конечно хорошо. А можно ли использовать операцию AND? Если да, то:

c = a AND b
a OR b = (a + b) - c


т.е. сначала находим число, состоящее из битов, "общих" у данных чисел.
Затем мы их складываем и вычитаем "общее" число. Вот вам и OR.
Но так или иначе, без логических операций тут не обойдётся.
Разве что складывать побитно...


 
vrem   (2008-08-13 06:40) [10]

Renegat
ну как это "не обойдётся"?
допустим число 16 битное - ячейка под число размером 16 бит. умножаем это число на 2, затем делим получившееся число на 2(умножаем на 0.5 если деления нет) сравниваем результат с исходным числом. если они равны, то старший бит =0, если не равны, то старший бит =1, так можно выявить все биты обоих чисел и затем вручную проделать с ними этот ор или любое что хочешь. в примере даже исключения не понадобились, а если они есть их можно использовать - есть исключение переполнения - значит старший бит =1


 
GlFox ©   (2008-08-13 12:06) [11]

Про FireBird...
CREATE OR ALTER PROCEDURE Get_Bin_Flag(
 FLAGS INTEGER,
 FLAG_NUM INTEGER)
RETURNS(
 FLAG_VALUE INTEGER)
AS
declare variable iCntr integer;
declare variable iTmp integer;
begin
 Flag_Value = :Flags;  iCntr = 0;
 while (:iCntr < :Flag_Num) do begin
   Flag_Value = :Flag_Value / 2;
   iCntr = :iCntr + 1;
 end
 iTmp = :Flag_Value / 2;
 if (:Flag_Value > (:iTmp * 2)) then Flag_Value = 1; else Flag_Value = 0;
 suspend;
end

- Получение битового флага, а вот как сделать OR... наверно, даже проще будет...


 
jack128_   (2008-08-13 12:42) [12]


> Про FireBird...


Я бы вот так реализовал:

DECLARE EXTERNAL FUNCTION bin_or
INTEGER, INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_bin_or" MODULE_NAME "ib_udf";


 
wl ©   (2008-08-13 13:31) [13]


> vrem   (13.08.08 06:40) [10]

а если IF тоже нет? по условию сравнение нам не дано.
насколько я понимаю должна быть формула
x|y = x...+/*...y...


 
Mystic ©   (2008-08-13 13:57) [14]

> а если IF тоже нет? по условию сравнение нам не дано.

Если количество бит фиксировано, то решение можно искать перебором. Поскольку аргумент может принимать только дискретные значения, то фукнций f(x1, x2) будет только конечное число. Образуем некое множество X, которое состоит из сложения и умножения. Образуем теперь новые функции как сложение или умножения двух любых функций этого множества. получим некоторое множество функций Y. Если Y есть подмножество X, то построить операцию OR невозможно. Иначе полагаем X равным объединению X и Y и повторям наши шаги. Например, если число бит в аргументе равно единице, то получаем такое выражение: f(x1, x2) = x1 * x2 + x1 + x2

Далее, количество бит произвольно. Тогда в силу определения OR мы получаем: x1 OR x1 = x1. Но если искомая формула содержит операцию сложения, то результат для x1, x2 > 0 будет больше чем x1. Поэтому сложение исползовать нельзя. Далее, x1 OR 0 = x1, но если в формелу используются только умножения и исползуется аргумент x2, то результатом будет 0. Таким образом, построить функцию OR на множестве всех натуральным чисел нельзя.


 
AlexKniga ©   (2008-08-13 14:30) [15]

a&b = a*b
a|b = a+b-ab
!a = 1-a

где & | ! логические операции AND, OR, NOT
     * + - арифметические.

1 = TRUE
0 = FALSE


 
Renegat ©   (2008-08-13 14:43) [16]

> a&b = a*b
Спорное утверждение.
10011010 & 1 == 10011010 != 0

> a|b = a+b-ab
Аналогично.
0001 | 1010 == 0001 + 1010 - 1010 == 0001 != 1011


 
Mystic ©   (2008-08-13 15:04) [17]


> > a&b = a*b
> Спорное утверждение.
> 10011010 & 1 == 10011010 != 0


Имеется в виду логическое AND, я не побитовое. Как в С++ операция &&.

Т. е.

10011010 != 0 => true
1 != 0 => true
true & true = true

и

10011010 * 1 = 10011010
10011010 != 0 => true



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1218377553
Урсулапов
2008-08-10 18:12
2008.10.05
А почему пост про день рождения 9 августа не было?


1-1199531227
ras122
2008-01-05 14:07
2008.10.05
помогите с работой с мышкой, пожалуйста


15-1218525210
oldman
2008-08-12 11:13
2008.10.05
Последовательность действий при заправке кардриджа (лазер)


15-1218766496
Slider007
2008-08-15 06:14
2008.10.05
С днем рождения ! 15 августа 2008 пятница


2-1219738954
Lexa11_2002
2008-08-26 12:22
2008.10.05
Как в String запихать ctrl+B





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский