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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.048 c
2-1173033268
AMW
2007-03-04 21:34
2007.04.01
Как возвратить строку из dll без ShareMem?


15-1173117673
nobody_1988
2007-03-05 21:01
2007.04.01
Books about win programming


2-1173105640
ITineraNT
2007-03-05 17:40
2007.04.01
Компоненты TRz..., Tabc...


4-1163413288
--= Eagle =--
2006-11-13 13:21
2007.04.01
Узнать марку привода


2-1173811838
Костя
2007-03-13 21:50
2007.04.01
Как узнать температуру процессора?