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

Вниз

Так каков приоритет у скобок?..   Найти похожие ветки 

 
Григорий Ситнин ©   (2003-07-08 16:23) [0]

Есть функция:

function CheckBit(AWord: word; ABit: word): boolean;
var w1,w2,w3,w4: word;
begin
w1 := AWord;
w2 := w1 shr Abit;
w3 := w2 shl 15;
w4 := w3 shr 15;
Result := w4 = 1;
// Result := (((AWord shr Abit) shl 15) shr 15) = 1;
end;


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

Уважаемые спецы, не могли бы вы мне рассказать, где я заблуждаюсь и что не учел?


 
Григорий Ситнин ©   (2003-07-08 16:24) [1]

Кстати, нет ли способа проще и вернее проверить (а можно и установить) бит в слове?


 
Poirot ©   (2003-07-08 16:33) [2]

можно через xor!
делаень 1 << <bit num > xor ЧИСЛО = 0
не установлен!


 
VMcL ©   (2003-07-08 16:36) [3]

>Poirot © (08.07.03 16:33)
>можно через xor!

Неужели? Я всегда считал, что проверить - через AND, а установить - через OR.


 
Poirot ©   (2003-07-08 16:37) [4]

Сорри не xor а and
(1 shl bit_num) and ЧИСЛО = 0 - не установлен


 
Poirot ©   (2003-07-08 16:38) [5]


> Неужели? Я всегда считал, что проверить - через AND, а установить
> - через OR.

оБШИБСЯ - С КЕМ НЕ БЫВАЕТ?!


 
VMcL ©   (2003-07-08 16:45) [6]

>Григорий Ситнин © (08.07.03 16:23)

function CheckBit(AWord: word; ABit: word): boolean;
begin
Result := ( Word((AWord shr Abit) shl 15) shr 15) = 1;
end;


 
Григорий Ситнин ©   (2003-07-08 16:50) [7]

Poirot: компиляция показала, что нифига не работает
VMcL: ага, работает. вся фишка была в приведении типа?


 
Семен Сорокин ©   (2003-07-08 16:53) [8]

Григорий Ситнин © (08.07.03 16:23)
и правильно, все верно - другой результат, просто w1..w4 - word (16 бит), поэтому w3 := w2 shl 15 - оставляет только последний бит (0 или 1), а если бы w3 было integer или int64, то w3 стало бы больше 2 байтов по размеру (что и происходит)
в твоем случае надо так:
Result := (AWord and Power(2, ABit)) = 1;


 
Poirot ©   (2003-07-08 16:54) [9]


> Poirot: компиляция показала, что нифига не работает

у кого как!


 
Григорий Ситнин ©   (2003-07-08 17:00) [10]

Poirot: мне-то хотелось бы, чтобы это работало и у меня =)
Семен Сорокин: можно, наверное, и так, но смысл? умножения в конце концов трансформируются как раз в сдвиги... да и модуль лишний подключать. А вот за объяснение спасибо, а то я уж с горя на асме переписал, чтобы хоть как-то оправдать пять строк кода. =)


 
Poirot ©   (2003-07-08 17:07) [11]


> Григорий Ситнин ©

на асме это конечно хорошо! Мда! Короче - вот такое движение бедного регистра - это сильно!!! Можно просто к типу привести!!!

что у вас выдаётся на эту строку
(1 shl 15) and (1 shl 15)


 
default ©   (2003-07-08 22:28) [12]

function CheckBit_(Value: Cardinal; BitPos: Byte): Boolean;
begin

Result := Value shr BitPos and 1 = 1

end;

на асме можно было сделать и через bts, НО когда есть скобки
asm end; компилятор автоматом вставляет пролог и эпилог подпрограммы - а он и не нужен - из-за этого на асме медленней получается, ээээх


 
default ©   (2003-07-08 22:31) [13]

default © (08.07.03 22:28)
вернее через bt
___________________


function CheckBit_(Value: Word; BitPos: Byte): Boolean;
begin

Result := Value shr BitPos and 1 = 1

end;



 
icWasya ©   (2003-07-09 10:47) [14]

ну если на асме тщ например так

function CheckBit_(Value: Word; BitPos: Byte): Boolean;
register; assembler;
asm
mov cl,dl;
shr ax,cl;
and ax,1;
end;


и никаких прологов и эпилогов


 
Hint ©   (2003-07-09 10:59) [15]

function IsBitSet(Value: integer; Bit: Byte) : boolean;
begin
result:= (Value and (1 shl Bit)) <> 0;

end;


 
Sandman25 ©   (2003-07-09 11:13) [16]

result:= odd(Value shr Bit);


 
Anatoly Podgoretsky ©   (2003-07-09 11:52) [17]

icWasya © (09.07.03 10:47)

assembler; это лишнее, оставлено для совместимости с Д1 и register; значение по умолчанию.




 
Григорий Ситнин ©   (2003-07-10 14:20) [18]

А мне еще вот так понравилось:

function CheckBitDW(Value, Index: Cardinal): Boolean;
asm
bt eax, edx
sbb eax, eax
end;


=)



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
1-77838
Navi
2003-07-06 13:49
2003.07.24
TUpDown in TStringGrid


1-77832
Shadow X
2003-07-09 09:38
2003.07.24
ShellTreeView


1-77938
lex7
2003-07-10 17:13
2003.07.24
Как сделать градиент?


4-78183
Alexander
2003-05-22 09:28
2003.07.24
Можно как-то узнать из dll где она располагается?


1-77940
SergeyI
2003-07-10 16:33
2003.07.24
TQuickRep как с ним работать ?