Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

Побитовые операции...   Найти похожие ветки 

 
rainstuff   (2006-07-12 20:31) [0]

В Delphi 5 есть тип данных Int64. Но побитовые операции типа "or" выполняются только над обычным integer. А нет ли таких функций, которые бы реализовали побитовые операции над 64-битным целым?
Или может у кого уже есть готовые функции для выполнения побитовых операций?


 
AndreyRus   (2006-07-12 21:20) [1]

1. Int64(X).Lo or Int64(Y).Lo
2. Int64(X).Hi or Int64(Y).Hi


 
rainstuff   (2006-07-12 22:20) [2]

На самом деле будет работать только если использовать тип из KOL

function primer(): Int64;
var
x,y:I64;
z:Int64;
begin
x:=I64(z);
x.Hi:=x.Hi shl 5;
x.Lo:=x.Lo shl 5;
// будет ли это эквивалентно x shl 5 ?
Result:=Int64(x); // правильно ли такое приведение типа?
end;


 
AndreyRus   (2006-07-12 23:03) [3]


> x.Hi:=x.Hi shl 5; x.Lo:=x.Lo shl 5;// будет ли это эквивалентно
> x shl 5 ?


Нет. Потеряется бит старший бит x.Lo
Смотрите как это реализовано в System.pas


//  64-bit shift left
// target (EAX:EDX) count (ECX)
procedure __llshl;
asm
       cmp cl, 32
       jl  @__llshl@below32
       cmp cl, 64
       jl  @__llshl@below64
       xor edx, edx
       xor eax, eax
       ret

@__llshl@below64:
       mov edx, eax
       shl edx, cl
       xor eax, eax
       ret

@__llshl@below32:
       shld  edx, eax, cl
       shl eax, cl
       ret
end;



> Result:=Int64(x); // правильно ли такое приведение типа?

Да.


 
rainstuff   (2006-07-12 23:17) [4]

>Нет. Потеряется бит старший бит x.Lo
>Смотрите как это реализовано в System.pas

тогда логичный вопрос - а как правильно сделать shl или shr над 64-битным числом?


 
AndreyRus   (2006-07-13 00:08) [5]

Я же привел пример :)

Если в Delphi 5 отсутствует возможность сдвига битов 64-х разрядного числа, в чем я кстати сомневаюсь, то можно использовать:


function Shl64(Lo, Hi: Cardinal; X: Byte): Int64;
asm
 cmp cl, 32
 jl  @__llshl@below32
 cmp cl, 64
 jl  @__llshl@below64
 xor edx, edx
 xor eax, eax
 ret
@__llshl@below64:
 mov edx, eax
 shl edx, cl
 xor eax, eax
 ret
@__llshl@below32:
 shld  edx, eax, cl
 shl eax, cl
end;


 
rainstuff   (2006-07-13 00:15) [6]

Спасибо!:) А через  X: Byte что передаётся?

Вот, что в хэлпе написано:
Note: Most standard routines that take integer arguments truncate Int64 values to 32 bits. However, the High, Low, Succ, Pred, Inc, Dec, IntToStr, and IntToHex routines fully support Int64 arguments. Also, the Round, Trunc, StrToInt64, and StrToInt64Def functions return Int64 values. A few routines—including Ord
—cannot take Int64 values at all.

Насчёт сдвигов ничего нет:))


 
AndreyRus   (2006-07-13 01:05) [7]


> А через  X: Byte что передаётся?

Сдвиг :)

Кстати, функцию можно упростить до:
function _Shl64(Value: Int64; ShiftCount: Byte): Int64;
asm
 MOV     CL, ShiftCount
 MOV     EAX, DWORD PTR [Value]
 MOV     EDX, DWORD PTR [Value + 4]
 SHLD    EDX, EAX, CL
 SHL     EAX, CL
end;



> Вот, что в хэлпе написано:


Аналогично написано и в хэлпе Delphi 7, однако поддержка присутствует. Надо было проверить, прежде чем писать в форум.


 
rainstuff   (2006-07-13 04:05) [8]

Извиняюсь:) Спасибо за оперативную помощь!:)



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

Форум: "KOL";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.052 c
2-1173249432
Zergik
2007-03-07 09:37
2007.04.01
Помогите с RaveReport


2-1173102470
Чайник
2007-03-05 16:47
2007.04.01
Максимальный размер статического массива


2-1173433604
Ega23
2007-03-09 12:46
2007.04.01
Механизм цветопередачи картинок к TAction при Enabled/Disabled


15-1173250917
Fredy314
2007-03-07 10:01
2007.04.01
Поздравляем прекрасную половину человечества с 8 Марта


1-1170872888
antonyan
2007-02-07 21:28
2007.04.01
1C





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский