Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
3-70595
jen_bond
2002-06-29 01:16
2002.07.22
Организация таблицы


3-70606
Gorynych
2002-06-30 13:50
2002.07.22
Установка значения DBLookupComboBox вручную


3-70636
Explorer
2002-07-01 13:00
2002.07.22
try...except при коннекции


1-70768
Андрусь
2002-07-09 19:47
2002.07.22
проблема с MDI приложением


1-70678
SPeller
2002-07-10 14:02
2002.07.22
Подсказки в Статус-баре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский