Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2010, 21:37   #1
Belii09878
 
Регистрация: 31.01.2010
Сообщений: 8
Вопрос Побитовый сдвиг

Дано длинное целое неотрицательное число. Выполнить циклический сдвиг его шестнадцатеричного представления на k цифр вправо. на чистом си.

Код:
#include <stdio.h>
#include <math.h>
unsigned long int a,x;
void main()
{
int y[10],i;
 
printf("vvedite chislo ne bolee 4294967295\n");
printf("X=");
scanf("%lu",&a);
printf("%lu=",a);
int k,b,c,n,j;
x=0;
i=0;
b=0;
while(a>=1){
x=((a-(a%16))/16);
k=(a%16);
a=x;
y=k;
i++;
}
а как теперь произвести сдвиг если число записано в массив??? Объясните пожалуйста.
Belii09878 вне форума Ответить с цитированием
Старый 01.02.2010, 00:47   #2
klsaymon
Пользователь
 
Регистрация: 15.01.2010
Сообщений: 22
По умолчанию

только наверно не "y = k" а "y[i] = k" как я понял...чтоб число то в массив записать...чет первое что в голову лезет, это перевести массив в строку(в символьный массив)...то есть отдельно каждый символ массива y[i](для этого надо от y[i] отнять 0х30 ну или '0')...а потом опять эту строку перевести в число по формуле numb = numb * 10 + ch[i] - 0x30;....ну а потом уже сдвигать...думаю должно сработать...
Не забываем повышать рейтинг(для тех, кому помог)...
klsaymon вне форума Ответить с цитированием
Старый 01.02.2010, 09:29   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Выполнить циклический сдвиг его шестнадцатеричного представления на k цифр вправо. на чистом си.
выделить последний бит (x and 0001)
сдвинуть остальные биты (x shr 1)
передвнуть выделенный бит ( z shl 3) 0001->1000
подготовить(очистить) место ( x and 1000)
склеить результаты (x or z)
повторить нужное число раз (сдвинуть нужное число бит сразу)

P.S. все числа записаны в двоичной форме
использовать битовые операции требуемого языка.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.02.2010 в 09:32.
evg_m вне форума Ответить с цитированием
Старый 01.02.2010, 12:46   #4
klsaymon
Пользователь
 
Регистрация: 15.01.2010
Сообщений: 22
По умолчанию

прощу прощения, ошибся...при переводе числа в строку надо прибавлять 0х30 а не вычитать....
Не забываем повышать рейтинг(для тех, кому помог)...
klsaymon вне форума Ответить с цитированием
Старый 01.02.2010, 18:44   #5
belii0987
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 13
Вопрос

Код:
#include <stdio.h>
#include <math.h>
unsigned long int a,x;
void main()
{
int y[10],i;
 printf("vvedite chislo ne bolee 4294967295\n");
printf("X=");
scanf("%lu",&a);
printf("%lu=",a);
int k,b,c,n,j;
x=0;
i=0;
b=0;
while(a>=1){
x=((a-(a%16))/16);
k=(a%16);
a=x;
y[i]=k;
i++;
}
char m[9];
for(i=b,j=0;i>=0;i--,j++)
m[j]=0x30+y[i];
x=atoi(m);
x=(x>>4)|(x<<((b*4)-4));
что сдесь неправильно ?? подскажите пожалуйста??
belii0987 вне форума Ответить с цитированием
Старый 01.02.2010, 20:12   #6
klsaymon
Пользователь
 
Регистрация: 15.01.2010
Сообщений: 22
По умолчанию

ты лучше скажи что не получается, то есть что неправильно работает??как перевести из массива в число я ведь уже написал...осталось сдвигать..
Не забываем повышать рейтинг(для тех, кому помог)...
klsaymon вне форума Ответить с цитированием
Старый 01.02.2010, 20:52   #7
belii0987
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 13
По умолчанию

дело в том что при переводе строки в число получается какая то ерунда
belii0987 вне форума Ответить с цитированием
Старый 01.02.2010, 20:56   #8
belii0987
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 13
По умолчанию

ты написал формулу numb = numb * 10 + ch[i] - 0x30;
тоесть в моём случае это x=x*10+m[i]-0x30 ;
А зачем умножать на 10?
belii0987 вне форума Ответить с цитированием
Старый 02.02.2010, 13:54   #9
klsaymon
Пользователь
 
Регистрация: 15.01.2010
Сообщений: 22
По умолчанию

если честно не знаю зачем умножать на 10(что-то с разрядами числа связано наверно) - просто прими эту формулу и все...вобщем все работать должно...сам проверял уже...у меня вывел...есть один вариант почему у тебя не получается...попробуй символьный массив обнулить перед использованием (memset(m, 0, sizeof(m))), то есть сразу после объявления...
Не забываем повышать рейтинг(для тех, кому помог)...
klsaymon вне форума Ответить с цитированием
Старый 02.02.2010, 14:23   #10
belii0987
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 13
По умолчанию

ок попробую спасибо
belii0987 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический сдвиг Mish92(21-09) Помощь студентам 0 07.11.2009 21:59
Сдвиг массива. Джед Общие вопросы C/C++ 19 10.06.2009 16:44
C++ побитовый сдвиг KOLYTFR Помощь студентам 1 03.06.2009 22:42
сдвиг строки Анастасия123456789 HTML и CSS 7 24.02.2009 18:10
Сдвиг файла OrdJONY Общие вопросы Delphi 13 21.12.2007 22:22