LINUX.ORG.RU

Битовые операции

 , ,


0

1

Всем привет! Вот есть DWORD который содержит MB_ICONINFORMATION or MB_YESNO, как узнать, что в этом DWORD содержатся данные флаги? Хоть убей не могу вспомнить, а в гугле всякая ересь лезет.

★★★★

Боже, лет 10 паскаль не трогал, но должно быть так

if a and (1 shl <номер бита>) then установлен
sparks ★★★
()
Ответ на: комментарий от sparks

Ну не совсем так, ты говоришь о проверке одного бита, а мне бы сразу все. Типа:

var
 Flags: UINT;
begin
 if Flags and MB_ICONINFORMATION then

Но ловлю

PointAbstracts.pas(148674,12) Error: Incompatible types: got «LongWord» expected «Boolean»

AntonyRF ★★★★
() автор топика

Протупил, содержимое флага обычным И проверяется

if SOME_DWORD and MB_ICONINFORMATION then ...
sparks ★★★
()
Ответ на: комментарий от sparks

Сейчас проверю в таком виде - Boolean(Flags and MB_ICONINFORMATION)

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

По логике для проверки сразу нескольких тебе надо ИЛИ использовать для набора флагов, и И для проверки.

1011 and ( 0010 or 0001 ) => 1011 and 0011

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

В целом, работает и твой вариант и мой

Boolean(Flags and MB_ICONINFORMATION)

В общем, всем спасибо. Давно не игрался с флагами и уже даже забыл про них =)

AntonyRF ★★★★
() автор топика

В общем случае (флаг из более чем одного бита), надо проверять

(value and flag) = flag
anonymous
()
Ответ на: комментарий от AntonyRF

В паскале, условные операторы принимают булевый тип(0 и 1), любое выражение к нему не приводится, как в ц-подобных(0 и не-0).
Насильное приведение через Boolean() наверное не очень идеологически верно и может где-то вызвать неожиданное поведение.

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

Вот есть DWORD
Boolean(Flags and MB_ICONINFORMATION)

Собственно говоря, как раз в твоем случае такое приведение не даст ожидаемого тобой результата. Проверь на подобном коде:

var
    x,y:dword;
begin
    x:=1;
    for y:=0 to 3 do begin 
        writeln('x=',x,' b(x)=',boolean(x));
        x:=x shl 8;
    end;
end.

Что он скомпиляется не ручаюсь(паскаль со школы не видел), но мысль думаю ясна.

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

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

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

Ты меня заинтриговал. Накотил фрипаскаль и посмотрел результат:

$> fpc hell.pas
Free Pascal Compiler version 2.6.4 [2018/04/06] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling hell.pas
Linking hell
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
8 lines compiled, 0.1 sec 
$> ./hell 
x=1 b(x)=TRUE
x=256 b(x)=FALSE
x=65536 b(x)=FALSE
x=16777216 b(x)=FALSE

Вероятно, все дело в том, что дельфи работает неправильно :)
Но fpc поступает тоже непоследовательно: берет первые 8 бит и сравнивет с нулем.

madcore ★★★★★
()
Последнее исправление: madcore (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.