Главная страница
    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.105 c
3-77738
Serval
2003-07-01 08:12
2003.07.24
Данные в отчет из БД


1-77983
Vasilii
2003-07-11 13:22
2003.07.24
двойная кнопка


14-78139
aterm
2003-07-08 14:24
2003.07.24
grids?


1-77866
Chadnov
2003-07-13 17:09
2003.07.24
[MDI]Как из дочернего окна узнать общее количество дочерних окон?


8-78004
sergn
2003-04-01 20:37
2003.07.24
Совмещение векторной печати и Bitmap с прозрачными участками





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский