Главная страница
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]


> Шифрование (в универе задали)

Да, точно. С двумя "л".


 
Weei   (2011-07-08 21:10) [41]

Удалено модератором
Примечание: Флудить завязывай


 
Weei   (2011-07-08 21:13) [42]


> DiamondShark ©   (08.07.11 21:09) [40]
> > Шифрование (в универе задали)Да, точно. С двумя "л".


что c двумя "л", слово "задали" ? :)


 
Weei   (2011-07-08 21:17) [43]

Удалено модератором


 
sniknik ©   (2011-07-08 21:24) [44]

> эээ... я не понял ты о каком типе?
UInt64


 
DVM ©   (2011-07-08 21:26) [45]


> sniknik ©   (08.07.11 21:24) [44]


> UInt64

а, так я же и написал, что для 64 переделать можно, а медленнее и длиннее - это для > 64 бит, типов же таких в Delphi нет готовых.


 
Weei   (2011-07-08 21:30) [46]

а UInt64 какая разница, я ж с указателями работаю.


 
DVM ©   (2011-07-08 21:32) [47]


> Weei   (08.07.11 21:30) [46]


> а UInt64 какая разница, я ж с указателями работаю.

Гипотетическому коду, который тобой еще не написан разницы может и нет, а по аналогии с функциями выше > 64 бит не сделать.


 
Плохиш ©   (2011-07-08 21:32) [48]


> Weei   (08.07.11 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 работают иначе.

Мая не плякать, мая ржать.
Дизайнер ландшафта трындит одно делает другое, а виноваты, как всегда, операторы делфи.
Не ври, shl и shr работают так как и описано.


 
sniknik ©   (2011-07-08 21:33) [49]

> это не флуд ?
это факт. ... если ты для скорости собираешься прокручивать массив битовыми операциями вместо "индексного взятия по указателю" ... нужно спасать программирование. причем в менеджеры или не дай Гейтс начальники, не годится, менеджер уверенный, что знает программирование, такого натворить может... близко к программистам подпускать нельзя в общем, в дворники в самый раз.

> это для > 64 бит, типов же таких в Delphi нет готовых.
наборы? вроде до 256.


 
sniknik ©   (2011-07-08 21:34) [50]

> а по аналогии с функциями выше > 64 бит не сделать.
по аналогии да, не сделать.


 
Weei   (2011-07-08 21:37) [51]


> Плохиш


выполни

Var i: Integer;
Begin
i:= 1;
i:= i shr 1;
i:= i shl 1;

end;

И скажи что у тебя в i будет ? а я тебе скажу 0, никак не 1, думай дальше

> Дизайнер ландшафта


 
Плохиш ©   (2011-07-08 21:40) [52]


> Weei   (08.07.11 21:37) [51]

А с какого там должна взяться 1? Справку по используемым операторам прочитай.

PS. Радует, что хоть подписываться ты уже научилось.


 
Dimka Maslov ©   (2011-07-08 21:43) [53]


> я знаю как работают  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 работают иначе.


Если сначала сдвигаем влево, а потом вправо, тогда и пишем с о о т в е т с т в е н н о
i:= 1;
i := i shl 1;
i := i shr 1;

ибо в аншлийском языке лево = left право = right


 
Inovet ©   (2011-07-08 21:44) [54]

> [51] Weei   (08.07.11 21:37)
> i:= i shr 1;
> i:= i shl 1;

Местами поменяй. А сочтёшь нужным - извинись.


 
Palladin ©   (2011-07-08 21:44) [55]


> Weei   (08.07.11 21:37) [51]

это когда веником махать, мусор сохраняется, а когда сдвигаешь направо, информация теряется... иди мусором махай, раз запрос правильно в гугле не написать никак...
http://www.google.ru/search?client=opera&rls=ru&q=rotate+bit&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest
http://en.wikipedia.org/wiki/Circular_shift


 
Weei   (2011-07-08 21:45) [56]


> sniknik


Я не программист я только учусь ... всё таки нужно как то отделять обучающихся от специалистов, а у вас всё в куче...

А насчёт массива, разве нельзя используя move большую часть массива перенести на "новое" место,  предварительно обработав начало и конец битовыми операциями?

Крутить 1024*8=8192 бит побитово это вам в голову пришло ....


 
DVM ©   (2011-07-08 21:47) [57]


> Weei   (08.07.11 21:45) [56]


> всё таки нужно как то отделять обучающихся от специалистов

это тут атмосфера такая спецфичная, не принимай близко к сердцу. С тобой еще по божески, можно сказать, обходятся. :)


 
Palladin ©   (2011-07-08 21:49) [58]

выживают сильнейшие )


 
Weei   (2011-07-08 21:50) [59]


> Плохиш


Мне нужно что бы возможно было произвести "обратное" преобразование
а ты почему то упёрся в shl и shr и более вариантов не видиш, я даж незнаю, DVM попробуй ты ему обьяснить у меня слов нет.

Если потребуется именно shr, а потом shl никак не соответственно.


 
Weei   (2011-07-08 21:51) [60]

Удалено модератором


 
Игорь Шевченко ©   (2011-07-08 21:53) [61]


> Я не программист я только учусь


вот и учись не клянчить по форумам


 
Weei   (2011-07-08 21:53) [62]

Я писал


> А насчёт массива, разве нельзя используя move большую часть
> массива перенести на "новое" место,  предварительно обработав
> начало и конец битовыми операциями?


Как думаете эта идея жизнеспособна ?


 
Inovet ©   (2011-07-08 21:53) [63]

> [56] Weei   (08.07.11 21:45)
> Я не программист я только учусь ... всё таки нужно как то
> отделять обучающихся от специалистов

Ты сам сказал "я знаком", "я знаю". Сказал бы сразу - хочу научится.


 
Palladin ©   (2011-07-08 21:57) [64]


> > А насчёт массива, разве нельзя используя move большую
> часть > массива перенести на "новое" место,  предварительно
> обработав > начало и конец битовыми операциями?

одной командой битовый сдвиг на гигабайте - нет, не для все пейсателей интел еще приспособилась... хотя мля на очереди походу... чего они там только не придумали...


 
Weei   (2011-07-08 21:57) [65]

Я подобные задачи решил оч. не рационально перпеводами из 1й системы счисления в др, а сюда обратился за советом к более опытным, а тут оказываются троли, и проч живность водится :)


 
sniknik ©   (2011-07-08 21:57) [66]

> разве нельзя используя move большую часть массива перенести на "новое" место
можно. но move не битовая операция, а байтовая/...

> предварительно обработав начало и конец битовыми операциями?
т.е. весь масив передвинуть на байт например, а конец и начало на бит? и что это получится?

> Крутить 1024*8=8192 бит побитово это вам в голову пришло ....
как сказано, и о чем разговор идет. если меняешь тему то говори про что речь сейчас.


 
Плохиш ©   (2011-07-08 21:59) [67]


> Я подобные задачи решил оч. не рационально перпеводами из
> 1й системы счисления в др

Можно огласить весь список систем счисления, которыми может оперировать процессор?


 
Inovet ©   (2011-07-08 21:59) [68]

> [62] Weei   (08.07.11 21:53)
> Как думаете эта идея жизнеспособна ?

На кратное 8, а иначе в каждом элементе надо сдвигать биты и с учетом соседних. Сложного ничего нет. Сделай на бумаге сначала схему сдвига, потом программно реализуй.

12345678 12345678 12345678
сдвигаем влево на 2
34567812 34567812 34567812


 
Palladin ©   (2011-07-08 22:00) [69]


> Можно огласить весь список систем счисления, которыми может
> оперировать процессор?

да откуда он у него ) парень считает что процессор процедуры делфи выполняет за шаг и на OnClick у баттона один такт процессора уходит )


 
sniknik ©   (2011-07-08 22:02) [70]

> перпеводами из 1й системы счисления в др
это как? как ты заставил комп считать в другой системе счисления? он троичной к примеру не понимает... ;(

говори используя не "умные" слова, а понятные. кодом например говори...


 
Inovet ©   (2011-07-08 22:02) [71]

> [65] Weei   (08.07.11 21:57)
> решил оч. не рационально перпеводами из 1й системы счисления в др

В памяти данные в одной системе хранятся - в двоичной, не говорим об экзотике BCD.


 
DVM ©   (2011-07-08 22:04) [72]


> sniknik ©   (08.07.11 22:02) [70]


> это как? как ты заставил комп считать в другой системе счисления?
>  

он в строку перевел


 
Weei   (2011-07-08 22:05) [73]

Всем спасибо, с утра на свежую голову буду куралесить

тему можно закрыть


 
Rouse_ ©   (2011-07-08 22:06) [74]


> Weei   (08.07.11 21:45) [56]
> А насчёт массива, разве нельзя используя move большую часть
> массива перенести на "новое" место,  предварительно обработав
> начало и конец битовыми операциями?

ЗАвисит от массива, иногда можно, иногда нельзя...


 
sniknik ©   (2011-07-08 22:06) [75]

> не говорим об экзотике BCD.
в итоге все одно двоичная.

> он в строку перевел
догадался.


 
Weei   (2011-07-08 22:08) [76]

Удалено модератором


 
Weei   (2011-07-08 22:08) [77]

Удалено модератором


 
Inovet ©   (2011-07-08 22:10) [78]

> [76] Weei   (08.07.11 22:08)
> а некоторые до сих пор вокруг, да около ?),

Ты ждёшь готовый код?


 
Palladin ©   (2011-07-08 22:11) [79]

) я вижу как DVM вошел в строку )


 
Игорь Шевченко ©   (2011-07-08 22:17) [80]


> тему можно закрыть


хозяин барин



Страницы: 1 2 вся ветка

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

Наверх




Память: 0.68 MB
Время: 0.011 c
15-1310499331
R_R
2011-07-12 23:35
2011.11.06
Хостинг+домен...


15-1310298590
Boxssss
2011-07-10 15:49
2011.11.06
Посоветуйте хостинг


2-1310662885
Anthony
2011-07-14 21:01
2011.11.06
Простой RTF редактор для Delphi


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


3-1265342997
Степан
2010-02-05 07:09
2011.11.06
IBDataset обновляет не все поля