Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Побитовый сдвиг  (Прочитано 6960 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Belii0987
Гость
« : 29-01-2010 17:35 » 

Здравствуйте !
Помогите, пожалуйста?!

Дано длинное целое неотрицательное число. Выполнить циклический сдвиг его шестнадцатИричного представления на 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[i]=k;
i++;
}

А что дальше делать?Не понял
« Последнее редактирование: 29-01-2010 20:19 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 29-01-2010 17:47 » 

нужно сдвинуть тетрады. То есть сдвинуть число на 4*k битов вправо, а всю задвинутую в перенос правую часть записать слева
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 29-01-2010 17:48 » 

Belii0987,  Копай в сторону операции >> и &.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Belii0987
Гость
« Ответ #3 : 01-02-2010 15:46 » 

Код:
#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));
Что здесь неправильно ?? Подскажите, пожалуйста??
« Последнее редактирование: 01-02-2010 17:28 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 01-02-2010 18:10 » 

мой вариант )
Код:
#include <stdio.h>
void main()
{
typedef unsigned long int TYPE;

typedef unsigned char BYTE;

TYPE a;

//------------
//ввод a
a=0x12345678;

//ввод k - на сколько хекс-разрядов сдвинуть вправо
BYTE k=3;
//------------

//на сколько битов сдвинуть влево, чтоб младшая тетрада оказалась старшей
const BYTE cicleshift=sizeof(TYPE)*8-4;

for(;k>0;k--)
{
BYTE temp=(BYTE)(a&0xf);
a>>=4;
a|=((TYPE)temp)<<cicleshift;

}

//а - результат
}

только если cicleshift на 32-битном процессоре будет больше 32 , то результат сдвига непредсказуем Улыбаюсь
« Последнее редактирование: 01-02-2010 18:11 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines