Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как произвести логическое уножение чисел [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо