Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1309939617
Nikita_novice
2011-07-06 12:06
2011.11.06
Странности IDE Delphi 7


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


15-1310456667
SQLEXPRESS
2011-07-12 11:44
2011.11.06
Обработка Dataset в потоке. Клонирование?


1-1271933869
Handbrake
2010-04-22 14:57
2011.11.06
Вопрос по взаимодействию компонентов.


2-1310988971
Criptonik
2011-07-18 15:36
2011.11.06
Список шрифтов в combobox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский