Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер переменных в памяти [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо