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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2020, 23:21   #1
Timamas
Новичок
Джуниор
 
Регистрация: 15.12.2020
Сообщений: 3
По умолчанию Побитовый сдвиг числа

Код:
#include <iostream>
using namespace std;
 
void hexrshift(const  unsigned long int x, unsigned shift)
{
    unsigned res;
 
    shift %= 2 * sizeof(x); // 0...15
    res = (shift ? (x >> (4 * shift)) | (x << (8 * sizeof(x) - 4 * shift)) : x);
 
    cout << "Число " << x << " сдвинутое на " << shift << " шагов вправо :" << res;
   
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    unsigned long int  n; 
    int k;
 
    cout << "Введите число в десятичной системе счисления n = "; cin >> n;
 
    cout <<"Число в шестнадцатиричной системе счисления: "<< hex << n << endl;
 
    cout << "Сдвиг вправно на k = "; cin >> k;
 
    hexrshift(n,k);
 
    return 0;
}
Ребзя, вот прога, мне нужно производить побитовый сдвиг шестнадцатиричного представления, но не учитывать ничего не значащие нули.
На пример:
я ввожу в прогу 13545
16-ый вид: 34e9
Сдвиг на k = 1
Прога выведет 9000034e
А мне нужно 934e.

Что делать?
Timamas вне форума Ответить с цитированием
Старый 15.12.2020, 23:24   #2
Timamas
Новичок
Джуниор
 
Регистрация: 15.12.2020
Сообщений: 3
По умолчанию

Забыл указать язык C++
Timamas вне форума Ответить с цитированием
Старый 16.12.2020, 00:25   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Странно. Я дал подробный развёрнутый ответ - он исчез. Циклически сдвиг 16-битного числа на 4 позиции вправо. Результат совпадает с желаемым.Чьи происки? ТС? Модератора?
Вот для истории:
Код:
const 
   FF_m = '0123456789ABCDEF' ;
........
procedure TForm1.Button3Click(Sender: TObject);
var i,j: integer;

function toFF(arg:integer) : string ;
var s: string; k,l: integer ;
begin
  k:= arg ;
  l := k and 15 ;
  s := Copy (FF_m,l+1,1);
  l := (k and $00F0) div 16 ;
  s := Copy (FF_m,l+1,1) + s;
  l := (k and $0F00) div 256 ;
  s := Copy (FF_m,l+1,1) + s;
  l := (k and $F000) div 4096 ;
  s := Copy (FF_m,l+1,1) + s;
  Result := s ;
end;

begin
  i := 13545 ;
  Memo1.Lines.Add(toFF(i)) ;
  j := i and 1 ;
  i := (i div 2) + j * $8000 ;
  Memo1.Lines.Add(toFF(i)) ;
  j := i and 1 ;
  i := (i div 2) + j * $8000 ;
  Memo1.Lines.Add(toFF(i)) ;
  j := i and 1 ;
  i := (i div 2) + j * $8000 ;
  Memo1.Lines.Add(toFF(i)) ;
  j := i and 1 ;
  i := (i div 2) + j * $8000 ;
  Memo1.Lines.Add(toFF(i)) ;
end;
34E9 -> 9A74 -> 4D3A -> 269D -> 934E
digitalis вне форума Ответить с цитированием
Старый 16.12.2020, 00:51   #4
Timamas
Новичок
Джуниор
 
Регистрация: 15.12.2020
Сообщений: 3
По умолчанию

Это Паскаль? Мне нужен с++(
Но большое спасибо
Timamas вне форума Ответить с цитированием
Старый 16.12.2020, 11:31   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Могу сделать, мне это как 2 пальца об асфальт Но С++ для меня не родной, поэтому проверишь сам, у меня на компе его нет.
Код:
int ShrRigh (arg:integer, N: integer)
{ int tmp, i, carry ;
  tmp = arg ;
  for (i=1;i<=N;i++)
    { if ((tmp & 1) > 0) carry = 0x8000; else carry = 0 ;
      tmp = ( tmp >> 1 ) | carry;
    }
  return (tmp) ;
}
Эта подпрограмма двигает циклически число arg на N позиций вправо. В твоём случае
Код:
   n = 13545 ;
   m =  ShrRigh (n, 4) ;

Последний раз редактировалось digitalis; 16.12.2020 в 11:52.
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си. Побитовый сдвиг Bayern_M Помощь студентам 6 19.05.2015 16:10
Побитовый сдвиг Belii09878 Помощь студентам 10 02.02.2010 14:46