Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 5196
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2522
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2009
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1590
Дата выхода:12.11.2010, 16:30
Администратор рассылки:Verena (Профессионал)
Подписчиков / экспертов:336 / 175
Вопросов / ответов:1 / 3

Вопрос № 180604: Здравствуйте у меня есть задание на поразрядная обработка целых чисел на языке си. нужно определить, является ли симметричным двоичное представление целого числа N. обработку числа необходимо сделать без использования строк, только с помощью сдвиг...



Вопрос № 180604:

Здравствуйте
у меня есть задание на поразрядная обработка целых чисел на языке си. нужно определить, является ли симметричным двоичное представление целого числа N. обработку числа необходимо сделать без использования строк, только с помощью сдвигов, масок и битовых операций (&, | и т.д.). компилятор - visual c++ 6.0
у меня есть примерный алгоритм - создать две маски, установить их на концы числа и в цикле сдвигать их к середине, сравнивая биты. как реализовать этот алгоритм на языке си, я не знаю. помогите, пожалуйста

Отправлен: 07.11.2010, 16:27
Вопрос задал: Татьяна Львова (Посетитель)
Всего ответов: 3
Страница вопроса »


Отвечает Гаряка Асмик (Профессор) :
Здравствуйте, Татьяна Львова!

Будем считать, что используем 32-битовый int.
Первая маска - 0x80000000. Для сдвига используем сдвиг вправо >>. Вторая маска первоначально равна 0x1.
Пусть число = n
В цикле 16 раз сравниваем n&m1 c n&m2
Вводим булеву переменную, которая определяет результат.
Код:

int n, i, m1=0x80000000, m2=0x1;
bool test=true;
printf("vvedite chislo\n");
scanf("%d", &n);
for(i=0;i<16;i++)
{
if((n&m1) != (n&m2))
{

test=false;
break;
}
m1>>=1;m2<<=1;
}
if (test==false)
printf(" ne simmetrichno\n");
else
printf("simmetrichno\n");

-----
Я ни от чего, ни от кого не завишу.

Ответ отправил: Гаряка Асмик (Профессор)
Ответ отправлен: 07.11.2010, 16:45
Номер ответа: 263864

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263864 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает vladisslav (6-й класс) :
    Здравствуйте, Татьяна Львова!
    Еще можно так сделать.
    5,3,6 и тому подобные числа будут симметричными.
    Отредактировано в соответствии с минифорумом
    -----
    ∙ Отредактировал: Verena (Профессионал)
    ∙ Дата редактирования: 10.11.2010, 17:02 (время московское)

    Приложение:

    Ответ отправил: vladisslav (6-й класс)
    Ответ отправлен: 08.11.2010, 13:02
    Номер ответа: 263881

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263881 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Micren (Профессионал) :
    Здравствуйте, Татьяна Львова!
    Программа. C++. Компилировал GCC.
    Код:
    /* 
    * File: main.cpp
    * Author: Micren
    *
    * Created on 9 Ноябрь 2010 г., 17:44
    */

    #include <limits>
    #include <iostream>

    using namespace std;

    typedef unsigned int data_t;

    /*
    *
    */

    // true если симметричное
    bool isSymmetric(data_t value);
    // В строку
    string toBinaryString(data_t value);

    int main()
    {
    while (true)
    {
    // Ввод числа
    cout << "Введите целое положительное число:";
    data_t val;
    cin >> val;
    if (cin.fail())
    {
    if (cin.eof())
    {
    break;
    }
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Ошибочный ввод" << endl;
    continue;
    }
    cout << "Число " << val << '(' << toBinaryString(val) << ") " << (isSymmetric(val) ? "" : "не ") << "симметричное" << endl;
    }
    return 0;
    }

    bool isSymmetric(data_t value)
    {
    data_t tmp = value, mirror = 0;
    while (tmp)
    {
    mirror = (mirror << 1) | (tmp & 1);
    tmp >>= 1;
    }
    return value == mirror;
    }

    string toBinaryString(data_t value)
    {
    string result;
    do
    {
    result = "01"[value & 1] + result;
    value >>= 1;
    }
    while (value);
    return result;
    }

    Пример работы:
    Код:
    Введите целое положительное число:1
    Число 1(1) симметричное
    Введите целое положительное число:2
    Число 2(10) не симметричное
    Введите целое положительное число:-1
    Число 4294967295(11111111111111111111111111111111) симметричное
    Введите целое положительное число:101
    Число 101(1100101) не симметричное
    Введите целое положительное число:5
    Число 5(101) симметричное


    Программа на С.
    Код:
    /*
    * File: main.cpp
    * Author: Micren
    *
    * Created on 9 Ноябрь 2010 г., 17:44
    */

    #include <stdlib.h>
    #include <stdio.h>
    #include <stdbool.h>

    typedef unsigned int data_t;

    #define DATA_BITS (sizeof (data_t) << 3)

    /*
    *
    */

    // true если симметричное
    bool isSymmetric(data_t value);
    // Печать в двоичном виде
    void printBinary(data_t value);

    int main()
    {
    data_t val;
    while (true)
    {
    // Ввод числа
    printf("Введите целое положительное число:");
    int ret = scanf("%u", &val);
    if (ret != 1)
    {
    if (feof(stdin))
    {
    break;
    }
    printf("Ошибочный ввод\n");
    return EXIT_F AILURE;
    }
    printf("Число %u(", val);
    printBinary(val);
    printf(") %s симметричное \n", isSymmetric(val) ? "" : "не");
    }
    return EXIT_SUCCESS;
    }

    bool isSymmetric(data_t value)
    {
    data_t tmp = value, mirror = 0;
    while (tmp)
    {
    mirror = (mirror << 1) | (tmp & 1);
    tmp >>= 1;
    }
    return value == mirror;
    }

    void printBinary(data_t value)
    {
    char buffer[DATA_BITS + 1] = {0}, *ptr = buffer + DATA_BITS;
    do
    {
    *--ptr = "01"[value & 1];
    value >>= 1;
    }
    while (value);
    printf("%s", ptr);
    }

    Ответ отправил: Micren (Профессионал)
    Ответ отправлен: 09.11.2010, 19:08
    Номер ответа: 263917

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 263917 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Ответ поддержали (отметили как правильный): 1 чел.



    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 10.11.2010

    В избранное