Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Система исчисления


Автор: kotey 6.12.2010, 11:07
Здравствуйте!!! пожалуйста помогите написать программу:

Написать функцию вывода на экран целого числа в двоичном виде с разбиением на удобно-читаемые структуры (тетрады или даже их половины). Поменять тетрады в двухбайтном целом числе - 1-ю с 3-ей, а 2-ю и 4-ю не трогать.

Очень нужно!


Автор: darkart 6.12.2010, 14:57
Код

#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 SwapNibbles14( int16& number )
//функция обмена 1 и 4 тетрады
{
    //запоминаем 1 и 4 тетрады, переставляя их на нужные позиции
    int16 nibble1 = ( number & 0xf000 ) >> 12;
    int16 nibble4 = ( number & 0x000f) << 12;
    number &= 0x0ff0;//обнуляем 1 и 4 тетрады
    number |= ( nibble1 | nibble4);//добавляем переставленные тетрады
}

int main()
{
    int16 x;
    cout << "Please enter x:" << endl;
    cin >> x;//вводи целое двухбайтное число
    cout << "Source number:" << endl;
    PrintNumber( x );//печатаем исходное число
    SwapNibbles14( x );//меняем тетрады местами
    cout << "Result number:" << endl;
    PrintNumber( x );//печатаем число с обмененными тетрадами
    return 0;//возвращаем результат
}

Автор: darkart 6.12.2010, 21:54
Не надо править первый пост, сообщения не приходят...
Теперь меняет произвольные тетрады.
Код

#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;//возвращаем результат
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)