Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Система исчисления 
:(
    Опции темы
kotey
Дата 6.12.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.12.2010

Репутация: нет
Всего: нет



Здравствуйте!!! пожалуйста помогите написать программу:

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

Очень нужно!



Это сообщение отредактировал(а) kotey - 6.12.2010, 21:04
PM MAIL   Вверх
darkart
Дата 6.12.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Код

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

PM MAIL WWW ICQ Skype GTalk   Вверх
darkart
Дата 6.12.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



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

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


PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.