Форум: "Прочее";
Текущий архив: 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