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


Автор: kotey 6.12.2010, 21:31
Из двух целых чисел a и b собрать одно, состоящее из чётных битов а и нечётных битов b.

Автор: darkart 6.12.2010, 22:22
Код

#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;//переводим курсор на новую строку
}

int16 GetNumber( int16 a, int16 b )  
{
    //считаю, что нумерация битов начинается с 0
    const int16 EVEN_MASK    = 0x5555;//четные
    const int16 ODD_MASK    = 0xaaaa;//нечетные
    
    //возвращаем число, состоящее из чётных битов а и нечётных битов b
    return    ( a & EVEN_MASK ) | ( b & ODD_MASK );
}

int main()
{
    int16 a, b, result;
    
    cout << "Please enter a:" << endl;
    cin >> a;//вводим целое двухбайтное число
    cout << "Please enter b:" << endl;
    cin >> b;//вводим целое двухбайтное число    
    
    cout << "a:" << endl;
    PrintNumber( a );//печатаем 1 исходное число
    cout << "b:" << endl;
    PrintNumber( b );//печатаем 2 исходное число   
    
    result = GetNumber( a, b ) ;//вычисляем новое число по условию задачи
    
    cout << "Result:" << endl;
    PrintNumber( result );//печатаем результирующее число
    
    return 0;//возвращаем результат
}


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