Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.691 c
4-1161439978
#0FFFF
2006-10-21 18:12
2007.03.04
GetFileVersionInfo


3-1165583259
DelphiLexx
2006-12-08 16:07
2007.03.04
импортировать xml в БД Firebird 2.0


15-1171193492
Parus
2007-02-11 14:31
2007.03.04
Всё этот самый ASP VBScript


2-1171534061
Trible
2007-02-15 13:07
2007.03.04
Посылать сообщения приложению


15-1170952605
Riply
2007-02-08 19:36
2007.03.04
Утилиты для проверки диска.