БлогNot. С++: циклический сдвиг числа влево/вправо на k бит

С++: циклический сдвиг числа влево/вправо на k бит

В дополнение к "битовой" теме, выполним циклический побитовый сдвиг значения влево или вправо. Например, при сдвиге влево самый старший (левый) бит числа "переезжает" в крайнюю правую позицию, а остальные биты сдвигаются на 1 влево.

Если n - 16-битное число, а k - количество бит, на которые нужно его сдвинуть (возможен многократный "циклический" сдвиг, так что k не обязано быть меньше 16), то имеем следующую реализацию:

#include <stdio.h>

unsigned int left_shift(unsigned int n,unsigned int k) {
 unsigned int i,bit;
 for (i=0; i<k; i++) {
  bit=n&0x8000?1:0;
  n<<=1;
  n|=bit;
 }
 return n;
}

unsigned int right_shift (unsigned int n,unsigned int k) {
 unsigned int i,bit;
 for (i=0; i<k; i++) {
  bit=n&0x0001;
  n>>=1;
  n|=bit<<15;
 }
 return n;
}

int main () {
 unsigned int n=0xF000,k=8;
 printf ("\nData: %u dec (%04X hex)",n,n);
 n=left_shift(n,k);
 printf ("\nResult after left shift on %d bit(s): %u dec (%04X hex)",k,n,n);
 n=right_shift(n,k);
 printf ("\nResult after right shift on %d bit(s): %u dec (%04X hex)",k,n,n);
 getchar();
 return 0;
}

Тест функций:

Data: 61440 dec (F000 hex)
Result after left shift on 8 bit(s): 240 dec (00F0 hex)
Result after right shift on 8 bit(s): 61440 dec (F000 hex)

Заменив 2-байтовые константы вида 0x8000 на 4-байтовые, а 15 на 31, можно получить аналогичный код для 32-битных целых.

29.11.2013, 19:31 [26125 просмотров]


теги: c++ программирование числа

показать комментарии (1)