Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2014, 18:02   #1
Kseni564
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 14
По умолчанию С++ вывести в двоичной

Здравствуйте! Помогите пожалуйста вывести "Инвертированный х" в двоичном виде именно с помощью функции printd, которая у меня описана. Задача то правильно написана, "Исходный х" тоже в двоичной выводит, а вот инвертированный не знаю как ...Подскажите!
Если что, вот задание: напишите программу invert(p,x,n), возвращающую значение х с инвертированными n-битами, начиная с позиции p ( остальные биты не меняются).

Код:

include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
 
unsigned invert(unsigned x, int p, int n)
{
    int count = sizeof(x) * 8;
    unsigned t = ((unsigned) ~0 << (p - 1)) >> (count - n) << (count - n - p + 1);
    return (~x & t) | (x & ~t);
}
 
void printd(int val, int base = 10)
{
    if(val < 0)
    {
        cout.put ('-');
        printd (-val, base);
    }
    else
    {
        if(val / base > 0) printd (val / base, base);
        int r = val % base;
        if(r < 10) cout.put ('0' + r);
        else cout.put ('A' + r - 10);
    }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    unsigned x;
    int p, n;
    cout << "Введите x в шестнадцатеричной: ";
    cin >> hex >> x;
    cout << "Введите p позицию и число инвертированных битов n: ";
    cin >> dec >> p >> n;
    cout << "Исходный x: "<< endl;
    printd(x,2);
    cout<< "\nИнвертированный x: " << invert(x, p, n) << endl;
    _getch();
    return 0;
}
Kseni564 вне форума Ответить с цитированием
Старый 17.05.2014, 19:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,298
По умолчанию

Код:
printd(invert(x, p, n),2);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2014, 19:56   #3
Kseni564
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
printd(invert(x, p, n),2);
не получается что-то, если это выглядит так
Код:
cout << "Исходный x: "<< endl;
	printd(x,2);
	cout<< "\nИнвертированный x: "<<invert(x,p,n)<< endl;
	printd(invert(x, p, n),2);
	_getch();
то выдает в таком виде:
Введите число в шестнадцатеричной: AF
Введите р позицию и число инвертированных n битов: 3 4
Исходный х: 10101111
Инвертированный х: 1006633135
111100000000000000000010101111
Kseni564 вне форума Ответить с цитированием
Старый 17.05.2014, 20:18   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,298
По умолчанию

Убрать <<invert(x,p,n)<< endl;, а так всё верно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2014, 20:53   #5
Kseni564
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Убрать <<invert(x,p,n)<< endl;, а так всё верно.
а откуда столько нулей?

я ввожу исходное число А в 16-ной, это 1010, а инвертированное 1100000000000000000000000001010
Kseni564 вне форума Ответить с цитированием
Старый 17.05.2014, 21:26   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,298
По умолчанию

Кажется я понял. Моя функция инвертирует биты в "полном" представлении числа (с незначащими нулями), а Вам, похоже, нужно только в значащей части.
Например:
Число 10111
n = 2 p = 3
00110000000000000000000000010111 (текущий вариант, так как число хранится в 4байтовой переменной)
10001 (наверное, нужно было так)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2014, 21:32   #7
Kseni564
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 14
По умолчанию

Ага
И как исправить ее, я это инвертирование ооочень плохо представляю
Kseni564 вне форума Ответить с цитированием
Старый 17.05.2014, 22:46   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,298
По умолчанию

Код:
unsigned invert(unsigned x, int p, int n)
{
    int count = sizeof(x) * 8;
    int tmp = count - 1;
    while (tmp >= 0 && !(1 << tmp & x)) --tmp;
    if (tmp >= 0) p += count - 1 - tmp;
    unsigned t = ((unsigned) ~0 << (p - 1)) >> (count - n) << (count - n - p + 1);
    return (~x & t) | (x & ~t);
}
Может быть, можно красивее.

UPD
Пожалуйста
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.05.2014 в 23:13.
BDA вне форума Ответить с цитированием
Старый 17.05.2014, 22:51   #9
Kseni564
Пользователь
 
Регистрация: 04.05.2014
Сообщений: 14
По умолчанию

Огромное спасибо Вам!!! Вы мне очень помогли!
Kseni564 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Цикл While. Вывести целые числа от А до В, А вывести 1 раз, число А+1 вывести 2 раза и т.д. schibeki Помощь студентам 4 07.02.2014 09:17
Из двоичной в Двоично-десятичную ftopkynik Общие вопросы C/C++ 0 05.07.2012 15:11
в двоичной системе незнайка_на_земле Помощь студентам 22 23.02.2011 08:15
как вывести число в двоичной форме? Dimarik Общие вопросы C/C++ 7 12.04.2010 17:52
работа в двоичной системе Toten Помощь студентам 3 06.03.2009 16:35