Форум: "Основная";
Текущий архив: 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