Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
ВнизOR, AND, вычисление флагов Найти похожие ветки
← →
VLS1 (2007-02-13 22:02) [0]У меня есть некая Word-овое значение, например $2004, само это значение -- это общий флаг, который получается путём OR-ования входящих составляющих ну т.е. например
PrjConst_MySQLReqUser = $2000;
PrjConst_MySQLReqHead = $0004;
соответственно $2000 OR $0004 = $2004.
Обратно проверяется опять же по подобной схемеValue = $2004;
if (Value and PrjConst_MySQLReqUser) = PrjConst_MySQLReqUser then ....
А теперь нужно определить исходя из всех флагов которые у нас присутствуют ($2000, $0004, ...), определить, какие не присутствуют в этом списке.
Поясню
Есть значение:
$2807, из них $2000 и $0004 нам известны, а вот остельные:
$0800
$0001
$0002
не известны.
Каким образом отделить и определить эти самые не известные?
Пытался что-то соорудить но дело заглозло на цикле.MySQLReqTypes: array [0.. bla] of Integer = (,PrjConst_MySQLReqUser, .....);
ReqTypeVal: Word;
ReqTypeVal := Value;
for i := Low(MySQLReqTypes) to High(MySQLReqTypes) do
if (MySQLReqTypes[i] and Value) = MySQLReqTypes[i] then
// ReqTypeVal := ReqTypeVal
.....
← →
Desdechado © (2007-02-13 22:13) [1]Для этого есть битовая операция XOR.
Ксоришь со всеми известными тебе, остаются неизвестные.
← →
Германн © (2007-02-13 22:43) [2]А для определения неизвестных пригодится операция SHL.
← →
VLS1 (2007-02-14 10:26) [3]Ок, спасибо, действительно с помощью ксора получил. Т.е. после всего у меня осталось $0803.
А как определить неизвестные используя SHL, пока не додумался, что подскажете?
← →
Desdechado © (2007-02-14 10:45) [4]SHL\SHR - сдвиг битов в числе
можно сдвигать на 1 и сравнивать, изменилось ли значение
исходя из этого можно делать выводы, запоминая на сколько сдвигал (это же степени двойки)
← →
VLS1 (2007-02-14 12:10) [5]С моим запасом знаний "логических операций", я просто откровенный тупица. Ничего не понял.
Ну вот есть у нас: $0803. Сдвинем по SHR, - получим: $0401, ещё раз сдвинем получим: $0200 и т.д. Т.е. я не понимаю что нужно учитывать, смотреть и т.д. при shr 1 - мы делим на 2, при shl - умножаем. ...
Я ничего не придумал. Может можно показать примером для моего случая?
← →
begin...end © (2007-02-14 12:18) [6]> VLS1 (14.02.07 12:10) [5]
var
Value: Word;
I: Integer;
begin
Value := $0803;
for I := 0 to 15 do
begin
if Odd(Value) then
ShowMessageFmt("Найден флаг: $%.4x", [1 shl I]);
Value := Value shr 1
end
end
← →
Сергей М. © (2007-02-14 12:22) [7]
> VLS1 (14.02.07 12:10) [5]
Вероятно под SHL в виду имелся не Паскаль-оператор, а ассемблерная инструкциия. Оба оператора логически эквивалентны, с той лишь разницей, что в ассемблерном блоке после shl можно тут же проанализировать флаг CF, где хранится значение вытолкнутого разряда сдвигаемого значения.
Если уж на то пошло, то уместней будет использовать DIV и MOD.
Ну а с точки зрения удобочитаемости кода еще уместней будет рассматривать это значение как множество, правда для этого придется для каждой маски в наборе флагов определить константу со значением порядкового номера соотв.бита
← →
evvcom © (2007-02-14 12:24) [8]Сделай через множества, проще будет.
type
TMySetValue = (Req0, Req1, ReqHead, Req3, ..., Req12, ReqUser, Req14, Req15);
TMySet = set of TMySetValue;
...
Value = $2004;
if ReqUser in TMySet(Value) then ...
Value = $2807;
for SetValue := Low(TMySetValue) to High(TMySetValue) do
if SetValue in TMySet(Value) then ...
И никаких сдвигов, всю эту арифметику за тебя посчитает компилятор.
← →
evvcom © (2007-02-14 12:25) [9]> [7] Сергей М. © (14.02.07 12:22)
Опередил, со множествами :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c