![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер переменных в памяти [D6, WinXP]
Yuri Btr © (2002-07-11 12:44:00)Ув. мастера, имеется совсем простой вопрос.
Я работаю с однобайтным числом допустим
var
k:byte;
Затем если я попытаюсь сделать
k:=255;
(k shl 3) shr 6
то получаю число 31 в десятичной.
Но в ручную когда я проверяю у меня получается - 3.
Компьютер оперирует двубайтными числами?
stepashka (2002-07-11 15:28:00) [1]Случайно увидел ваш спор. Вообще то в хелпе сказано, что операндами shl, shr есть чила типа Integer. Согласно концепции OP сначала параметры приводяться к требуемому типу, а потом над ними выполнняеться операция, т.е. работа идет с 4-х байтными числами
Anatoly Podgoretsky (2002-07-11 15:18:00) [2]Yuri Btr © (11.07.02 15:15)
Это не ассемблер, а Паскаль, но это не важно, главное что это логика булевых операций.
По вопросу, посмотри с помощью отладчика, что там происходит
Yuri Btr (2002-07-11 15:15:00) [3]to Anatoly Podgoretsky ©
Да, правда. Спасибо за ответы.
Значит я вообще не разбираюсь в ассемблере :-( Буду учиться.
Anatoly Podgoretsky (2002-07-11 15:09:00) [4]Я хотеел сказать, что у меня тоже самое выражение, только оптимизированное и без сюрпризов, результат равен 3
Yuri Btr (2002-07-11 15:01:00) [5]to Толик ©
shr 6 проводится над результатом (k shl 3), где k:byte
to Skier ©
Спасибо за такую функцию
to Anatoly Podgoretsky ©
Я к сожалению так и не понял что вы хотели сказать.
to Wild
Конечно, можно и так. Надо только подобрать маску.
Спасибо всем за ответы. Однако мне до сих пор не понятно, почему при явном указании k:Byte операция сдвига всё таки работает с k как с 2хбайтным числом.
Anatoly Podgoretsky (2002-07-11 14:52:00) [6]Не так, а $18 но он не приводит, что собирается с этими битами делать,решений очнь много в зависимости от задачи
Wild (2002-07-11 14:46:00) [7]А разве нельзя проверить так
if (k and $C)=$C then ....
Anatoly Podgoretsky (2002-07-11 13:42:00) [8]Yuri Btr © (11.07.02 13:11)
У меня конечно не получится 0000 00 11:-)
valery_f (2002-07-11 13:26:00) [9]2 Yuri Btr
Глянь в отладчике ассемблерный код - сдвиговые операции происходят как минимум с двумя байтами, даже если у тебя только один байт. Поэтому при SHR-ах надеяться на то, что старшие разряды заполнятся нулем или размножится знак не приходится - там может оказаться мусор. Вариант:
case ((k shr 3) and 3) of
0: ...
1: ...
2: ...
else {т.е. 3} ...
end;
Толик (2002-07-11 13:25:00) [10](k shl 3) гораздо больше, чем может вместить в себя byte, поэтому туда помещается только число 248, хотя в integer влезает целиком 2040. А вот теперь вопрос: над переменной какого типа происходит операция shr 6 ??? Если над byte - то д.б. 3, если над integer - то 31
Skier (2002-07-11 13:15:00) [11]>Yuri Btr
> мне надо проверить 3й и 4й биты этого числа
function IsBitOn (Value : Integer; Bit : Byte) : Boolean;
begin
Result := (Value and (1 shl Bit)) <> 0;
end;
Yuri Btr (2002-07-11 13:11:00) [12]to Anatoly Podgoretsky ©
Проблема в том, что у меня есть число к примеру 255, мне надо проверить 3й и 4й биты этого числа. Я делаю сдвигами, т.е слвигаю сначала вправо - стирая первые три бита (shr 3), а затем влево - стирая первые шесть бит (shl 6) таким образом у меня получается число, последние два бита которого (6,7) - биты для проверки. Т.е если было 111 1 1111 то получится 0000 00 11
Anatoly Podgoretsky (2002-07-11 12:55:00) [13]Замени на (k shr 3) and 3 или на (k and $18) shr 3