Форум: "Прочее";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
ВнизРотация бит Найти похожие ветки
← →
Weei (2011-07-08 19:33) [0]Здравствуйте.
Кто нибуть сталкивался/знает алгоритм (возможно даже команды) для ротации бит в памати исключая перевод в строки (желательно что бы на входе принимались указатель, размер и количество смещающихся бит )
Например:
var a:integer = $00000011;
...
Смещая в лево на 1 получим $00000110
p.s.
Я знаком с алгеброй логики.
← →
sniknik © (2011-07-08 19:52) [1]> Смещая в лево на 1 получим $00000110
вообще то $00000022
p.s.
> Я знаком с алгеброй логики.
да ну?
← →
Weei (2011-07-08 19:59) [2]
> > Смещая в лево на 1 получим $00000110вообще то $00000022p.
> s.> Я знаком с алгеброй логики.да ну?
я видимо не совсем понятно объяснил
если сдвиг на 1 в лево, то все биты сдвигаются в лево, а вытесненный бит добавляется в конец
пример (сдвиг влево на 1, 8ми разрядной последовательности):
00000011
00000110
00001100
00011000
00110000
нули с лева это для понятности их можно не писать.
← →
Dimka Maslov © (2011-07-08 20:04) [3]Неужели в самом деле нам запретили пользоваться shl и shr?
← →
Weei (2011-07-08 20:06) [4]написав
> var a:integer = $00000011
я ошибся, это 16тиричное представление, я хотел сказать в 2й системе, но в pascal так нельзя.
Мне хотелось бы избежать перевода из 10й в 2ю систему счисления да ещё и в строку сдвигать "буковки" и наоборот, есть что ни будь побыстрее ?
← →
DiamondShark © (2011-07-08 20:08) [5]Это троль.
← →
sniknik © (2011-07-08 20:08) [6]> я видимо не совсем понятно объяснил
1 бит влево, чего не понятного? но $ это 16-чное представление в дельфи.
теперь вместо никому не нужных объяснений сам посчитай
> $00000011;
> Смещая в лево на 1 получим $00000110
← →
antonn © (2011-07-08 20:08) [7]
> Это троль.
с двумя "л"
← →
sniknik © (2011-07-08 20:09) [8]> но в pascal так нельзя.
ДА НУ???
← →
sniknik © (2011-07-08 20:11) [9]хотя требуется уточнение - как нельзя? а то мало ли что ты там у себы внутри имеешь в виду.
← →
Weei (2011-07-08 20:12) [10]sniknik научите задавать значение переменным в 2й системе счисления без предварительных "конвертаций"...
← →
DVM © (2011-07-08 20:14) [11]
> Weei (08.07.11 20:06) [4]
function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
asm
MOV CL, DL
ROL AX, CL
end;
function RotateLeftBits32(const Value: LongWord; const Bits: Byte): LongWord;
asm
MOV CL, DL
ROL EAX, CL
end;
function RotateRightBits16(const Value: Word; const Bits: Byte): Word;
asm
MOV CL, DL
ROR AX, CL
end;
function RotateRightBits32(const Value: LongWord; const Bits: Byte): LongWord;
asm
MOV CL, DL
ROR EAX, CL
end;
← →
sniknik © (2011-07-08 20:15) [12]см. [9], что именно ты хочешь? константу? - не задается, значение? - в asm вставке можно с буквой b в конце.
← →
Германн © (2011-07-08 20:15) [13]Ассемблерной вставкой можно.
← →
Dimka Maslov © (2011-07-08 20:17) [14]
> sniknik научите задавать значение переменным в 2й системе
> счисления без предварительных "конвертаций"...
Для этих целей и придумана шестнадцатеричная система
← →
Weei (2011-07-08 20:19) [15]я знаю как работают shl и shr.
Var i: Integer;
Begin
i:= 1;
i:= i shr 1;
i:= i shl 1;
В результате в i будет 0, я же пытаюсь объяснить следующее
Если имеется битовая 8ми разрядная последовательность
00000001 (A)
сдвигаем влево на 1
00000010 (B)
сдвигаем вправо на 1
00000001 (с)
C совпадает с A, shl и shr работают иначе.
← →
DVM © (2011-07-08 20:20) [16]
> Германн © (08.07.11 20:15) [13]
> Ассемблерной вставкой можно.
можно и без вставки, только геморно и длинно выходит, для сравнения:function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and $8000 = 0 then
Result := Result shl 1
else
Result := Word(Result shl 1) or 1;
end;
← →
DVM © (2011-07-08 20:20) [17]
> Weei (08.07.11 20:19) [15]
> shl и shr работают иначе.
см [16]
← →
Weei (2011-07-08 20:21) [18]
> DVM
Вы сами писали код ? если да, можно зделать тоже для 64х битных значений ?
← →
sniknik © (2011-07-08 20:24) [19]> Вы сами писали код ?
да ты что! кто же сейчас сам пишет... сейчас код только "тырят" друг у друга в инете. не пишут, и "достают" (во всех смыслах :)).
← →
Weei (2011-07-08 20:26) [20]Я нехотел вас обидеть.
> "тырят" друг у друга
Вот поэтому и спросил, можно для 64х битных зделать?...
← →
DVM © (2011-07-08 20:27) [21]
> Weei (08.07.11 20:21) [18]
> Вы сами писали код ? если да, можно зделать тоже для 64х
> битных значений ?
нет я его не писал, это из Delphi Fundamentals
> если да, можно зделать тоже для 64х битных значений ?
А самому переделать паскалевский вариант не судьба? За тебя переделать?
← →
Weei (2011-07-08 20:32) [22]
> DVM
Спасибо за код.
ps
давно заметил чем вежливее общаюсь, тем грубее относятся.
← →
Rouse_ © (2011-07-08 20:37) [23]
> Weei (08.07.11 20:26) [20]
> Вот поэтому и спросил, можно для 64х битных зделать?...
сделать можно, но только тут есть проблема, дельфи для 64 бит еще нет, а так вообщеROL RAX, 1/ROR RAX, 1
сделает тебе сдвиг в нужном направлении под х64
← →
sniknik © (2011-07-08 20:39) [24]> дельфи для 64 бит еще нет
а зачем 64 код/дельфи? и в 32 битном есть 64битные типы.
← →
Weei (2011-07-08 20:40) [25]
> Rouse
ооооо это вы голубчик не в ту степь, в этой теме нет и намёка на 64х битную архитектуру, речь о 64х битных значениях, которые к вашему сведению поддерживались ещё на пентиум 1
← →
sniknik © (2011-07-08 20:41) [26]> ps
> давно заметил чем вежливее общаюсь, тем грубее относятся.
а ты попробуй вежливо разговаривать, а не просить глупых одолжений.
← →
Weei (2011-07-08 20:43) [27]мне на
> sniknik © (08.07.11 20:39) [24]
> > дельфи для 64 бит еще нета зачем 64 код/дельфи?
я балдею, где вы тут нашли 64 код я может хочу int64 "крутить", в идеале участок памяти размером N (n кратно 2)
даж в начале написал
> желательно что бы на входе принимались указатель, размер
> и количество смещающихся бит
← →
Weei (2011-07-08 20:46) [28]DVM единственный кто понял.
> а не просить глупых одолжений.
я незнаком с ассемблером, а паскалевский вариант не видел, тестил первые 4 предложенные функции.
← →
Rouse_ © (2011-07-08 20:46) [29]
> sniknik © (08.07.11 20:39) [24]
а... пардон, я чей-то подумал что вопрос именно под х64 идет
← →
DVM © (2011-07-08 20:49) [30]
> Weei (08.07.11 20:46) [28]
> а паскалевский вариант не видел
как это не видел
← →
Weei (2011-07-08 20:51) [31]Пропустил несколько постов, паге даун нажал быстро, случайно...
Уже увидел.
← →
DVM © (2011-07-08 20:54) [32]
> Weei (08.07.11 20:51) [31]
вот остальные, если интересно, для 64 бит переделать можно, для большей длины сложнее будет и медленнее. Зачем вертеть биты в большом буфере, что за задача такая?function RotateLeftBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and $8000 = 0 then
Result := Result shl 1
else
Result := Word(Result shl 1) or 1;
end;
function RotateLeftBits32(const Value: LongWord; const Bits: Byte): LongWord;
var I, B : Integer;
begin
Result := Value;
if Bits >= 32 then
B := Bits mod 32
else
B := Bits;
for I := 1 to B do
if Result and $80000000 = 0 then
Result := Result shl 1
else
Result := LongWord(Result shl 1) or 1;
end;
function RotateRightBits16(const Value: Word; const Bits: Byte): Word;
var I, B : Integer;
begin
Result := Value;
if Bits >= 16 then
B := Bits mod 16
else
B := Bits;
for I := 1 to B do
if Result and 1 = 0 then
Result := Result shr 1
else
Result := (Result shr 1) or $8000;
end;
function RotateRightBits32(const Value: LongWord; const Bits: Byte): LongWord;
var I, B : Integer;
begin
Result := Value;
if Bits >= 32 then
B := Bits mod 32
else
B := Bits;
for I := 1 to B do
if Result and 1 = 0 then
Result := Result shr 1
else
Result := (Result shr 1) or $80000000;
end;
← →
sniknik © (2011-07-08 21:01) [33]> для большей длины сложнее будет и медленнее.
неа, только тип поменять... в D7 поддержан почти полностью. с чем и будут проблемы так это с отображением. перевод в строку почти везде кривой для 64 битного (с вариантами тоже проблемы).
> я балдею, где вы тут нашли
не балдей, учись читать.
← →
Weei (2011-07-08 21:03) [34]
> DVM
ух...
> Зачем вертеть биты в большом буфере, что за задача такая
Шифрование (в универе задали)
я думаю так, считываю из файла массив длинной 1024
var p:Pointer;
size:Integer;
var a:array [0..1023] of integer;
...
// тут я считал массив
...
p:=@a;
size:=1024*SizeOf(Integer);
а далее, перед применением "основного" алгоритма
RotateRightBits(p, size, N); // N - вычисляется
Я думаю участок памяти за 1н раз "прокрутить" быстрее чем по a[i] обращаться.
← →
sniknik © (2011-07-08 21:06) [35]> Я думаю участок памяти за 1н раз "прокрутить" быстрее чем по a[i] обращаться.
в дворники. срочно!
← →
Rouse_ © (2011-07-08 21:06) [36]
> Weei (08.07.11 20:40) [25]
> ооооо это вы голубчик не в ту степь
Спасибо, голубчик, каюсь и посыпаю пеплом морщины :)function RotateLeft64(Value: int64; Count: Byte): int64;
function RepeatRol(Value: int64): int64;
begin
Result := ((Value and $8000000000000000) shr 63) + Value shl 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRol(Result);
end;
function RotateRoght64(Value: int64; Count: Byte): int64;
function RepeatRol(Value: int64): int64;
begin
Result := ((Value and 1) shl 63) + Value shr 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRol(Result);
end;
← →
Rouse_ © (2011-07-08 21:07) [37]зы: так вот без очепяток, бо на коленке писал:
function RotateRight64(Value: int64; Count: Byte): int64;
function RepeatRor(Value: int64): int64;
begin
Result := ((Value and 1) shl 63) + Value shr 1;
end;
var
I: Integer;
begin
Result := Value;
for I := 0 to Count - 1 do
Result := RepeatRor(Result);
end;
← →
Weei (2011-07-08 21:08) [38]
> Rouse_
Спасибо
надеюсь я это осилю....
← →
DVM © (2011-07-08 21:09) [39]
> sniknik © (08.07.11 21:01) [33]
> неа, только тип поменять... в D7 поддержан почти полностью.
эээ... я не понял ты о каком типе?
← →
DiamondShark © (2011-07-08 21:09) [40]
> Шифрование (в универе задали)
Да, точно. С двумя "л".
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c