Не надо править первый пост, сообщения не приходят... Теперь меняет произвольные тетрады.
| Код | #include <iostream> using namespace std; typedef unsigned short int int16;//тип двухбайтовое целое void PrintNibble( int16 nibble ) //функция печати тетрады { const int BIT_MASK = 0x8;//маска соответствует двоичному 1000 for( int i = 0; i <= 3; i++ )//для каждого двоичного разряда //сдвигаем на i разрядов влево, тем самым делая текущий выводимый разряд старшим для тетрады //накладываем маску 1000, оставляя только старший разряд //сдвигаем старший разряд на место младшего и выводим его cout << ( ( ( nibble << i ) & BIT_MASK ) >> 3 ); } void PrintNumber( int16 number ) //функция печати двухбайтного целого { const int NIBBLE_MASK = 0xf000;//маска соответствует старшей тетраде for( int i = 0; i <= 3; i++ )//для каждой тетрады { //сдвигаем на i тетрад влево, тем самым делая текущую выводимую тетраду старшей для числа //накладываем маску , оставляя только старшую тетраду //сдвигаем старшую тетраду на место младшей и выводим ее PrintNibble( ( ( number << ( i << 2 ) ) & NIBBLE_MASK ) >> 12 ); cout << " ";//печатаем пробел } cout << endl;//переводим курсор на новую строку } void SwapNibbles( int16& number, int i, int j ) //функция обмена i-ой и j-ой тетрады { //для правильной индексации - для 1 тетрады - сдвиг - 0 i--; j--; //сдвигаем на тетрады - 4 разряда i *= 4; j *= 4; //вычисляем нужные тетрады int16 nibblei = ( ( number & ( 0xf << i ) ) >> i ) << j; int16 nibblej = ( ( number & ( 0xf << j ) ) >> j ) << j; //составляем число - заново number &= ~( number & ( 0xf << i ) ) | ( number & ( 0xf << j ) ); number |= ( nibblei | nibblej ); } int main() { int16 x; cout << "Please enter x:" << endl; cin >> x;//вводим целое двухбайтное число cout << "Source number:" << endl; PrintNumber( x );//печатаем исходное число SwapNibbles( x, 1, 3 );//меняем тетрады местами cout << "Result number:" << endl; PrintNumber( x );//печатаем число с обмененными тетрадами return 0;//возвращаем результат }
|
|