Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Операции с битами в Си 
:(
    Опции темы
nevermind
Дата 25.4.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 15.5.2004

Репутация: нет
Всего: нет



Не подскажите как осуществить ротатцию битов в Си? smile

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

PM   Вверх
_hunter
Дата 25.4.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 13
Всего: 98



>>n и <<n
если сдвиг на один бит -- >>1


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
maxim1000
Дата 25.4.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
>>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;
}



--------------------
qqq
PM WWW   Вверх
nevermind
Дата 29.4.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 15.5.2004

Репутация: нет
Всего: нет



спасибо smile
PM   Вверх
bel_nikita
Дата 30.4.2005, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



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


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 30.4.2005, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 2
Всего: 110



Цитата
это циклическим сдвигом называется

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


--------------------
qqq
PM WWW   Вверх
AISIN
Дата 30.4.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 27.1.2005
Где: Пушкино

Репутация: 1
Всего: 1



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 ).

Это сообщение отредактировал(а) AISIN - 1.5.2005, 15:47
--------------------
Внимание!!! Внимание!!!Запущена программа по завоеванию мира!!!Выполненно 0,000000000000000000000000000000000000000000000000000002%
PM MAIL   Вверх
Sardar
Дата 30.4.2005, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
nevermind
Дата 14.9.2005, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 15.5.2004

Репутация: нет
Всего: нет



прошло достаточно много времени, задача уже давно выполенена, решил вот на память запостить работающий вариант.
мож кому пригодится 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; /*втолкнуть его слева*/
}

PM   Вверх
Romikgy
Дата 14.9.2005, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



ИМХО с асмовыми вставками было бы проще smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nevermind
Дата 14.9.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 15.5.2004

Репутация: нет
Всего: нет



Я пишу пользуюсь Eclipse, mingw compiler, intel processor. Пытался вставить asm, но никак не получается, выдает постоянно ошибку. Не мог бы ты написать простенький примерчик для наглядности.
PM   Вверх
Romikgy
Дата 15.9.2005, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Мог бы 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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.