Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.039 c
6-1160740746
ISP
2006-10-13 15:59
2007.04.01
Пересылка variant массива по T*Socket


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


1-1170769652
Lagrima
2007-02-06 16:47
2007.04.01
Запуск сервиса на Windows Server 2003


15-1173576885
eXPell
2007-03-11 04:34
2007.04.01
Концепты от LADA


2-1173427767
Megabyte
2007-03-09 11:09
2007.04.01
Переменная типа Файл в качестве параметра




   Наверх