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

Вниз

Ротация бит   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.008 c
15-1309939617
Nikita_novice
2011-07-06 12:06
2011.11.06
Странности IDE Delphi 7


15-1310424630
R_R
2011-07-12 02:50
2011.11.06
Как протестировать работу с интернетом?


2-1310636801
Cobalt
2011-07-14 13:46
2011.11.06
Как работает CharInSet?


2-1311017214
R_R
2011-07-18 23:26
2011.11.06
Где находится VK_ENTER?


3-1265617737
Tornado
2010-02-08 11:28
2011.11.06
Что нужно добавить в дистриб?