Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Операции с битами в Си


Автор: nevermind 25.4.2005, 16:44
Не подскажите как осуществить ротатцию битов в Си? smile

(Как ассемблере 11100011 - 11110001 - 11111000 - 01111100 - 00111110 и т.д.)

Автор: _hunter 25.4.2005, 17:35
>>n и <<n
если сдвиг на один бит -- >>1

Автор: maxim1000 25.4.2005, 23:05
Цитата
>>n и <<n
если сдвиг на один бит -- >>1

не, это - сдвиг
ротация, это когда то, что сдвинулось в один конец, потом с другого вылазит smile

если нужно циклически сдвинуть байт, то можно приблизительно так:
Код

unsigned char ShiftLeft(unsigned char x,int n)
{
  unsigned short xx=x;
  n%=8;
  xx<<=n;
  xx+=(xx>>8);
  return (unsigned char)xx;
}
unsigned char ShiftRight(unsigned char x,int n)
{
  unsigned short xx=x<<8;
  n%=8;
  xx>>=n;
  xx+=(xx>>8);
  return xx;
}

Автор: nevermind 29.4.2005, 23:54
спасибо smile

Автор: bel_nikita 30.4.2005, 00:13
smile
Цитата
ротация, это когда то, что сдвинулось в один конец, потом с другого вылазит
это циклическим сдвигом называется smile

Автор: maxim1000 30.4.2005, 12:32
Цитата
это циклическим сдвигом называется

я не уверен, но мне казалось, что это синонимы...

Автор: AISIN 30.4.2005, 17:46
maxim1000Так и есть! если верить моей большой энциклопедии,
а я привык верить своей энциклопедии...
Код

Ротация (от лат. rotatio - круговращение)- последовательное,
постепенное перемещение эл-тов, какой либо структуры.

В моем компиляторе содержиться пример ротации в файле
rotr.c. можно использовать в своей программе в виде функции
unsigned _rotr(val, shift) вызывается с помощью
_lrotr ( unsigned long val, int shift ).
И файл rotl.c c функциями
unsigned _rotl(val, shift) и вызывается с помощью
_lrotr ( unsigned long val, int shift ).
Хотя при необходимости их можно вызвать напрямую.
Код
 
[b]Sardar[/b] Одной ассемблерной инструкцией это делается, под любым процессором есть, обычно RTL/RTR называються. Смотри справочник

А я что сказал? _lrotr ( unsigned long val, int shift ).

Автор: Sardar 30.4.2005, 21:04
Одной ассемблерной инструкцией это делается, под любым процессором есть, обычно RTL/RTR называються. Смотри справочник.

Автор: nevermind 14.9.2005, 02:52
прошло достаточно много времени, задача уже давно выполенена, решил вот на память запостить работающий вариант.
мож кому пригодится smile

Код

void rotateLeft(int number)
{
   int leftBit = (number & 0x80) >> 7; /*запомнить бит стоящий слева*/
   number = (number<< 1) + leftBit;  /*втолкнуть его справа*/
}

void rotateRight(int number)
{
   int rightBit = (number & 0x01) << 7; /*запомнить бит стоящий справа*/
   number = (number >> 1) + rightBit; /*втолкнуть его слева*/
}

Автор: Romikgy 14.9.2005, 08:32
ИМХО с асмовыми вставками было бы проще smile

Автор: nevermind 14.9.2005, 14:47
Я пишу пользуюсь Eclipse, mingw compiler, intel processor. Пытался вставить asm, но никак не получается, выдает постоянно ошибку. Не мог бы ты написать простенький примерчик для наглядности.

Автор: Romikgy 15.9.2005, 08:49
Мог бы smile
Код

unsigned int rotateLeft(unsigned int number)    
{    
   asm("mov 0x8(%ebp),%eax"); 
   asm("roll $1,%eax");    
   
}    
unsigned int rotateRight(unsigned int number)    
{    
   asm("mov 0x8(%ebp),%eax");
   asm("rorl $1,%eax"); 
   
}
unsigned int rotateLeftn(unsigned int number,unsigned int n)    
{    
   asm("mov 0x8(%ebp),%eax");    
   asm("mov 0xc(%ebp),%ecx");  
   asm("roll %cl,%eax");  
   
}    
unsigned int rotateRightn(unsigned int number,unsigned int n)
{    
   asm("mov 0x8(%ebp),%eax"); 
   asm("mov 0xc(%ebp),%ecx");    
   asm("rorl %cl,%eax");  
   
}

Нужны пояснения?
ЗЫ Тонкости в гугле по словам :
AT&T Assembler
GNU Assembler
или для начала
http://sig9.com/articles/att-syntax
http://cs.wwc.edu/~aabyan/Unix/x86.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)