![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как произвести логическое уножение чисел [D7]
sD © (2008-09-16 15:17:00)Здравствуйте! Как произвести логическое уножение чисел в бинарном виде в Delphi? Есть ли операция в delphi аналогичная "&" в С++.
Пр. 2&3 = true
1&2 = false
Anatoly Podgoretsky (2008-09-16 18:26:00) [1]> Правильный$Вася (16.09.2008 17:48:18) [18]
А зачем ты с short сравниваешь, сравнивай с CHAR
Правильный$Вася (2008-09-16 17:48:00) [2]
> И отсутствие байт
а зачем они?
если есть short
Vlad Oshin (2008-09-16 17:25:00) [3]:)
var
b:byte;
q:boolean;
p1:^boolean;
pb:^byte;
begin
b:=1;
q:=false;
if q
then ShowMessageFmt('%d True',[b])
else ShowMessageFmt('%d false',[b]);
pb:=@b;
p1:=@q;
copymemory(p1,pb,1);
if q
then ShowMessageFmt('%d True',[b])
else ShowMessageFmt('%d false',[b]);
//----------
b:=223;
q:=false;
if q
then ShowMessageFmt('%d True',[b])
else ShowMessageFmt('%d false',[b]);
pb:=@b;
p1:=@q;
copymemory(p1,pb,1);
if q
then ShowMessageFmt('%d True',[b])
else ShowMessageFmt('%d false',[b]);
Anatoly Podgoretsky (2008-09-16 17:06:00) [4]> Правильный$Вася (16.09.2008 16:38:12) [12]
И отсутствие байт
Ega23 (2008-09-16 16:50:00) [5]
> в каждом языке свои правила :)
> можешь даже явно преобразовывать, никто ж не запрещает
Это потенциальная дырка. Вон, [8] - наглядный пример.
Правильный$Вася (2008-09-16 16:46:00) [6]
> Ну неправильно это
в каждом языке свои правила :)
можешь даже явно преобразовывать, никто ж не запрещает
Ega23 (2008-09-16 16:44:00) [7]
> собственно, это из той же категории, что char и int - одно
> и то же, без всяких ord
Ну неправильно это. Есть основные типы: логический, числовой, литеральный и указатель. И должны быть функции приведения между ними.
Ты же не будешь писать
var
obj : TSomeClass;
b : Boolean;
begin
obj := nil;
b := Boolean(obj);
end;
Ты так и проверишь: if obj=nil then ...
Правильный$Вася (2008-09-16 16:38:00) [8]собственно, это из той же категории, что char и int - одно и то же, без всяких ord
Правильный$Вася (2008-09-16 16:37:00) [9]
> одна из фич С, которая лично мне крайне не нравится
а мне нравится
очень изящно, хотя нужно постоянно помнить, чтоб не напортачить
Ega23 (2008-09-16 16:24:00) [10]я может не точно выразился...
В общем, при приведении к Boolean нужно логическое выражение задавать. Т.е.
b1 := not Boolean(2=0).
Только тут приведение нафиг не нужно, и без Boolean сработает...
Ega23 (2008-09-16 16:21:00) [11]
b1:= boolean(2);
потому, что b1:= boolean(2>0);
han_malign (2008-09-16 16:15:00) [12]
> q:=boolean(b);
> if q then ShowMessage(inttostr(b));
........
> потому, что Boolean = not (Result=0)
b1:= boolean(2);
b2:= true;
if(b1)then begin
if( not(b1 and b2) )then ShowMessage('Invalid type cast for boolean');
if( b1 <> true )then ShowMessage('Invalid type cast for boolean');
if( not(b1) )then ShowMessage('Invalid type cast for boolean');
end;
Ega23 (2008-09-16 15:29:00) [13]
> ну, в Си 0 - false, не ноль - true
А вот одна из фич С, которая лично мне крайне не нравится. В том плане, что все можно проверять на истину-ложь без явного приведения к логическому типу.
Ega23 (2008-09-16 15:28:00) [14]
> чего это вдруг не 0 стало false?
потому, что Boolean = not (Result=0)
Правильный$Вася (2008-09-16 15:27:00) [15]
> Результат - ноль, но это все равно не false
тьфу, это ж побитово... запарился...
ну, в Си 0 - false, не ноль - true
Vlad Oshin (2008-09-16 15:22:00) [16]var
b:byte;
q:boolean;
b:=1 and 2;
q:=boolean(b);
if q then ShowMessage(inttostr(b));
Юрий Зотов (2008-09-16 15:22:00) [17]> Правильный$Вася (16.09.08 15:20) [2]
Результат - ноль, но это все равно не false. Хотя значение и совпадает, но тип - другой.
Правильный$Вася (2008-09-16 15:20:00) [18]
> 1&2 = false
чего это вдруг не 0 стало false?
Юрий Зотов (2008-09-16 15:19:00) [19]1. AND
2. 2&3 равно 2, а не true.