Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.22;
Скачать: CL | DM;

Вниз

Размер переменных в памяти   Найти похожие ветки 

 
Yuri Btr ©   (2002-07-11 12:44) [0]

Ув. мастера, имеется совсем простой вопрос.
Я работаю с однобайтным числом допустим
var
k:byte;
Затем если я попытаюсь сделать
k:=255;
(k shl 3) shr 6
то получаю число 31 в десятичной.
Но в ручную когда я проверяю у меня получается - 3.
Компьютер оперирует двубайтными числами?


 
Anatoly Podgoretsky ©   (2002-07-11 12:55) [1]

Замени на (k shr 3) and 3 или на (k and $18) shr 3


 
Yuri Btr ©   (2002-07-11 13:11) [2]

to Anatoly Podgoretsky ©
Проблема в том, что у меня есть число к примеру 255, мне надо проверить 3й и 4й биты этого числа. Я делаю сдвигами, т.е слвигаю сначала вправо - стирая первые три бита (shr 3), а затем влево - стирая первые шесть бит (shl 6) таким образом у меня получается число, последние два бита которого (6,7) - биты для проверки. Т.е если было 111 1 1111 то получится 0000 00 11


 
Skier ©   (2002-07-11 13:15) [3]

>Yuri Btr


> мне надо проверить 3й и 4й биты этого числа



function IsBitOn (Value : Integer; Bit : Byte) : Boolean;
begin
Result := (Value and (1 shl Bit)) <> 0;
end;


 
Толик ©   (2002-07-11 13:25) [4]

(k shl 3) гораздо больше, чем может вместить в себя byte, поэтому туда помещается только число 248, хотя в integer влезает целиком 2040. А вот теперь вопрос: над переменной какого типа происходит операция shr 6 ??? Если над byte - то д.б. 3, если над integer - то 31


 
valery_f   (2002-07-11 13:26) [5]

2 Yuri Btr

Глянь в отладчике ассемблерный код - сдвиговые операции происходят как минимум с двумя байтами, даже если у тебя только один байт. Поэтому при SHR-ах надеяться на то, что старшие разряды заполнятся нулем или размножится знак не приходится - там может оказаться мусор. Вариант:

case ((k shr 3) and 3) of
0: ...
1: ...
2: ...
else {т.е. 3} ...
end;


 
Anatoly Podgoretsky ©   (2002-07-11 13:42) [6]

Yuri Btr © (11.07.02 13:11)
У меня конечно не получится 0000 00 11 :-)


 
Wild   (2002-07-11 14:46) [7]

А разве нельзя проверить так
if (k and $C)=$C then ....


 
Anatoly Podgoretsky ©   (2002-07-11 14:52) [8]

Не так, а $18 но он не приводит, что собирается с этими битами делать,решений очнь много в зависимости от задачи


 
Yuri Btr ©   (2002-07-11 15:01) [9]

to Толик ©
shr 6 проводится над результатом (k shl 3), где k:byte

to Skier ©
Спасибо за такую функцию

to Anatoly Podgoretsky ©
Я к сожалению так и не понял что вы хотели сказать.

to Wild
Конечно, можно и так. Надо только подобрать маску.

Спасибо всем за ответы. Однако мне до сих пор не понятно, почему при явном указании k:Byte операция сдвига всё таки работает с k как с 2хбайтным числом.


 
Anatoly Podgoretsky ©   (2002-07-11 15:09) [10]

Я хотеел сказать, что у меня тоже самое выражение, только оптимизированное и без сюрпризов, результат равен 3


 
Yuri Btr ©   (2002-07-11 15:15) [11]

to Anatoly Podgoretsky ©
Да, правда. Спасибо за ответы.
Значит я вообще не разбираюсь в ассемблере :-( Буду учиться.


 
Anatoly Podgoretsky ©   (2002-07-11 15:18) [12]

Yuri Btr © (11.07.02 15:15)
Это не ассемблер, а Паскаль, но это не важно, главное что это логика булевых операций.
По вопросу, посмотри с помощью отладчика, что там происходит


 
stepashka   (2002-07-11 15:28) [13]

Случайно увидел ваш спор. Вообще то в хелпе сказано, что операндами shl, shr есть чила типа Integer. Согласно концепции OP сначала параметры приводяться к требуемому типу, а потом над ними выполнняеться операция, т.е. работа идет с 4-х байтными числами



Страницы: 1 вся ветка

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
1-70806
Fiend
2002-07-10 14:52
2002.07.22
И снова Service


3-70587
masik
2002-06-28 15:51
2002.07.22
Помогите подключить Linked Server


1-70773
anod
2002-07-09 22:28
2002.07.22
Объясните мне пожалуйста,


1-70700
SuperVK
2002-07-11 10:09
2002.07.22
Как убрать первый нередактируемый столбец в TStringGrid?


3-70635
ASM
2002-07-01 15:20
2002.07.22
FormattedMemo?