Форум: "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