Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перевод из oct в dec, С++

12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
Помогите пожалуйста реализовать данную задачу с помощью битовых операций.. Или подскажите нормальный док по этой теме... Заранее благодарен.
247
20 апреля 2007 года
wanja
1.2K / / 03.02.2003
В смысле, строковую запись восьмеричного числа перекрючить в десятичное число? Тогда примерно так:
 
Код:
//s - строка, n - будет число
n=0;
i=0;
while (s!=0)
  {
  n=n<<3;
  n=n|(s-'0')
  }
12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
Нет, это не совсем то.. Мне надо взять int в восьмеричной системе и перевести его в int в десятичной с побощью поразрядных операций... И наоборот...
15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
Код:
int oct_to_dec(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num % 10;
    oct_num /= 10;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;
}
12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
Т.Е.. Это обычный алгоритм перевода, только результат деления вписывается не в массив, а дописывается в int. Правильно?.. Гениально....
2.1K
20 апреля 2007 года
elan
56 / / 10.04.2003
Число oct_num нужно рассматривать в 8-ричной СС. Т.е. делить на 8 и модуль от 8.
Код:
int oct_to_dec(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num&0x7;
    oct_num>>=3;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;

}
15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
elan, ты не прав. Твоя функция ничего не переводит, она лишь копирует одно число в другое.
Правильный вариант был предложен мной выше.
12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
Sara, или кто-нибудь, можете для меня расшифровать цыкл, который тут используется.. типа построчных камментов, оч. хочется понять всё до конца. Заранее спасибо)
242
20 апреля 2007 года
Оlga
2.2K / / 04.02.2006
и твое и его решение правильное, просто в FAQ'e есть решение аналогичной задачи....
2.1K
20 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: Sara
elan, ты не прав. Твоя функция ничего не переводит, она лишь копирует одно число в другое.
Правильный вариант был предложен мной выше.

Скорей всего ты права, но если посмотреть рез.программы ниже

Код:
#include <iostream>
#include <conio.h>

using namespace std;

int oct_to_dec(int oct_num)
{
   int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num&0x7;
    oct_num>>=3;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;

}

int oct_to_dec_sara(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num % 10;
    oct_num /= 10;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;
}

void main()
{
  int oct_num = 06254;

  cout << oct << oct_num << "  "  << dec << oct_num << "  "  << oct_to_dec_sara(oct_num) << endl;
  cout << oct << oct_num << "  "  << dec << oct_num << "  "  << oct_to_dec(oct_num) << endl;

  getch();
}
то получается, что твоя ф-ия считает, что восьмеричное
05254 равна 10-му 1700.
15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
to elan: запустила твой код - на экране получилось примерно следующее:
Цитата:
oct 3244 dec 1700
oct 3244 dec 3244

Ну и чем тебе не нравится мой результат? 3244 в восьмеричной - это 1700 в десятичной.

А второй вариант (твой) - это просто копирование одного числа в другое, что и требовалось доказать.

Цитата: OlgaKr
и твое и его решение правильное, просто в FAQ'e есть решение аналогичной задачи....


Я, конечно, не супер-пупер программист, но отличить правильное решение от неправильного вполне способна. Для этого достаточно всего лишь скомпилировать код и попробовать запустить его :)

12K
20 апреля 2007 года
St0p
59 / / 15.04.2007
Люди, пасиб вам огромный! Тока я всё ещё не понемаю смысла строк
 
Код:
int dig = oct_num % 10;
    oct_num /= 10;
    dig <<= 3*i;
    dec_num |= dig;

Я с точки зрения математики понемаю что оно делает, но КАК оно это делает до меня просто не доходит... Возможно, я сам по себе трудный, но интересно!
ЗЫ: 1700(dec) = 3244(oct) : )
2.1K
20 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: Sara
to elan: запустила твой код - на экране получилось примерно следующее: ....

Если запустить ту программу, тогда примерно получается:

oct 5254 = dec 3244 = dec 1700
oct 5254 = dec 3244 = dec 3244

Цитата:
Ну и чем тебе не нравится первый вариант? 3244 в восьмеричной - это 1700 в десятичной.



Есть например 12 битовое двоичное число 110011100101 = dec 3301.
Тогда, чтоб получить 8-ное представление, нужно просто разделить это число на триады:
110011100101 -> 110 011 100 101 -> 6345.

Твоя ф-я переводит 8-ое 06345 в десятичное 1729.

15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
[QUOTE="elan"]Твоя ф-я переводит 8-ое 06345 в десятичное 1729.[/QUOTE]
Хорошо, проверим.
Код:
#include <iostream.h>
#include <conio.h>

int oct_to_dec(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num % 10;
    oct_num /= 10;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;
}

void main()
{
  int oct_num = 6345;
  clrscr();

  cout << "oct " << oct_num << " = "  << "dec " << oct_to_dec(oct_num) << endl;
  getch();
}

Запускаем, смотрим результат:
Цитата:
oct 6345 = dec 3301


Комментарии нужны?

2.1K
20 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: St0p
Люди, пасиб вам огромный! Тока я всё ещё не понемаю смысла строк

Код:
dig = oct_num&0x7; | в dig записываются посл. 3 бита oct_num
dig <<= 3*i;       | полученную цифру умножаем на 8 в степени i
dec_num |= dig;    | прибаваляем к результату
oct_num>>=3;       | выталкиваем посл. 3 бита из oct_num

напр. oct_num = 110 011 100 101

1-й проход

dig = oct_num&0x7; | dig = 101(bin) = 5(dec)
dig <<= 3*i;       | dig = 5 * (8^0) = 5
dec_num |= dig;    | dec_num = 0 + 5 = 5
oct_num>>=3;       | oct_num = 110 011 100

2-й проход

dig = oct_num&0x7; | dig = 100(bin) = 4(dec)
dig <<= 3*i;       | dig = 4 * (8^1) = 32
dec_num |= dig;    | dec_num = 32 + 5 = 37
oct_num>>=3;       | oct_num = 110 011

3-й проход

dig = oct_num&0x7; | dig = 011(bin) = 3(dec)
dig <<= 3*i;       | dig = 3 * (8^2) = 192
dec_num |= dig;    | dec_num = 37 + 192 = 229
oct_num>>=3;       | oct_num = 110

4-й проход

dig = oct_num&0x7; | dig = 110(bin) = 6(dec)
dig <<= 3*i;       | dig = 6 * (8^3) = 3072
dec_num |= dig;    | dec_num = 229 + 3072 = 3301
oct_num>>=3;       | oct_num = 0
2.1K
20 апреля 2007 года
elan
56 / / 10.04.2003
Цитата: Sara
Хорошо, проверим....
Комментарии нужны?

Все правильно, за исключением одного мизера. 8-ое число начинается с 0-я.
Т.е. вместо
int oct_num = 6345;
нужно писать
int oct_num = 06345;

242
20 апреля 2007 года
Оlga
2.2K / / 04.02.2006
Цитата:
Я, конечно, не супер-пупер программист, но отличить правильное решение от неправильного вполне способна. Для этого достаточно всего лишь скомпилировать код и попробовать запустить его :)


извини, просто не заметила что ты делишь на 10, вместо 8 :). если этот момент подправить, тогда и твоя функция будет работать. А вообще прекращайте спорить, вопрос решен.
Всем спасибо за участие :)

242
20 апреля 2007 года
Оlga
2.2K / / 04.02.2006
Цитата: St0p
Люди, пасиб вам огромный! Тока я всё ещё не понемаю смысла строк
 
Код:
int dig = oct_num % 10
    oct_num /= 8;
    dig <<= 3*i;
    dec_num |= dig

Я с точки зрения математики понемаю что оно делает, но КАК оно это делает до меня просто не доходит... Возможно, я сам по себе трудный, но интересно!
ЗЫ: 1700(dec) = 3244(oct) : )



Код:
int oct_to_dec(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num % 10;/*получаем последнюю цифру числа в СС8 путем деления на базис СС 10*/
    oct_num /= 10;/*отбрасываем последнюю цифру числа*/
    dig <<= 3*i; /*устанавливаем позицию цифры в числе*/
    dec_num |= dig;/*прибавляем цифру к числу результату*/
  }
  return dec_num;
}
 
void main(void)
{
 int n = 7546;
 printf("%d\n\n", oct_to_dec(n));
}
15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
Цитата: elan
Все правильно, за исключением одного мизера. 8-ое число начинается с 0-я.
Т.е. вместо
int oct_num = 6345;
нужно писать
int oct_num = 06345;


С чего ты это взял? :D
Если написать так, как ты предлагаешь, то преобразование из восьмеричной системы в десятичную будет происходить дважды! Хочешь, покажу фокус? Запускаем программу:

 
Код:
#include <iostream.h>
#include <conio.h>

void main()
{
  int oct_num = 06345;
  cout << oct_num << endl;
  getch();
}

И видим на экране десятичную запись числа:
Цитата:
3301


Без всяких там функций oct_to_dec() и прочих. :D

15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
Цитата: OlgaKr
извини, просто не заметила что ты делишь на 10, вместо 8 :). если этот момент подправить, тогда и твоя функция будет работать. :)


Ничего исправлять не надо, функция работает правильно. Делить надо именно на 10 :)
Если делить на 8, преобразование теряет всякий смысл, ибо превращается в тупое копирование одной переменной в другую.

242
20 апреля 2007 года
Оlga
2.2K / / 04.02.2006
Сара, помоему у вас просто разный подход к постановке задачи. Какой более правильный судить преподавателю, который его дал.

Цитата:
Если делить на 8, преобразование теряет всякий смысл, ибо превращается в тупое копирование одной переменной в другую.


Преобразование может и тупое, но и в вашем варианте вижу смысла не больше, кроме тренировки мозга)). В жизни более низкого уровня числа сохраняются в стринг, а потом преобразовываются в нужный формат(СС).

15K
20 апреля 2007 года
Sara
79 / / 04.01.2007
Цитата: OlgaKr
Сара, помоему у вас просто разный подход к постановке задачи. Какой более правильный судить преподавателю, который его дал.


Преобразование может и тупое, но и в вашем варианте вижу смысла не больше, кроме тренировки мозга)). В жизни более низкого уровня числа сохраняются в стринг, а потом преобразовываются в нужный формат(СС).


Я поняла задачу так. Дано некоторое число X, в десятичной записи которого отсутствуют цифры 8 и 9. Надо найти такое число Y, чтобы его восьмеричная запись совпадала с десятичной записью X. Например, если X = 20, то Y = 16. Если X = 21, то Y = 17, и т.д. Моя функция для каждого X находит соответствующий Y. Полезна она или нет - не мне судить, но в принципе, гипотетически можно придумать ситуацию, когда потребуется именно такое преобразование.
Ваша же функция не может быть полезна даже гипотетически, ибо она просто ничего не преобразует (или, говоря математическим языком, выполняет тождественное преобразование), т.е. она берет число X и возвращает то же самое число. Именно это я и хочу показать:

Код:
#include <stdio.h>
#include <conio.h>

int oct_to_dec(int oct_num)
{
  int dec_num = 0;
  for(int i=0; oct_num > 0; i++)
  {
    int dig = oct_num&0x7;
    oct_num >>= 3;
    dig <<= 3*i;
    dec_num |= dig;
  }
  return dec_num;
}

void main()
{
  int x = 12345;
  int y = oct_to_dec(x);
  if(x == y) printf("Функция выполняет тождественное преобразование");
  getch();
}

Честно говоря, не думала, что такую простую вещь придется доказывать так долго :(
2.1K
21 апреля 2007 года
elan
56 / / 10.04.2003
2Sara Если ты говоришь о нашей программе, тогда будь добра, бери ее как есть, и не изменяй ее по своему желанию, чтоб потом могла сказать: вот она ничего не делает. Посмотри мой код и код OlgaKr. В них восьмеричные константы начинаются с нуля. Так как для того, чтоб константа была восьмеричной, мало, чтоб в ней не было 8 и 9-ок, нужно еще, чтоб она начиналась с 0.

Если в наши программы записать
int oct_num = 012345;
то они вернут 5349.

Это просто ты определяешь неграмотно 8-ричную константу.

На прилагаемом скриншоте вырезка из MSDN для Visual C++.
В ней, говорится, что для того, чтоб определить в программе константу не в десятичной СС, в качестве префикса нужно использовать символ показывающий СС этого числа.
242
21 апреля 2007 года
Оlga
2.2K / / 04.02.2006
тему закрываю, т.к. мы все не любим поспорить, а спор абсолютно пустой ИМХО. перечитала ВСЕ посты автора, которого за нечеткое изложение вопроса надо бы на мыло пустить)), начинаю думать что Сара права.

ВСЕМ спасибо за помощь, к автору топика просьба на будущее четко формулировать задания при создании темы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог