Форум: "Основная";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];
ВнизРазмер переменных в памяти Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c