С++: циклический сдвиг числа влево/вправо на 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 [26520 просмотров]