Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Григорий Ситнин   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
7-78165
BoTToN!k
2003-05-14 14:31
2003.07.24
адресная книга


1-77906
Sasha82
2003-07-14 13:03
2003.07.24
Типа про скроллбар


14-78039
Skier
2003-07-07 09:23
2003.07.24
---|Ветка была без названия|---


14-78124
Chieftain
2003-07-08 11:15
2003.07.24
Выживание человечества в следующие 20 лет


3-77803
dougine
2003-06-30 13:49
2003.07.24
Как отследить ошибку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский