перевод из oct в dec, С++
n=0;
i=0;
while (s!=0)
{
n=n<<3;
n=n|(s-'0')
}
{
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;
}
{
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;
}
Правильный вариант был предложен мной выше.
Правильный вариант был предложен мной выше.
Скорей всего ты права, но если посмотреть рез.программы ниже
#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.
oct 3244 dec 3244
Ну и чем тебе не нравится мой результат? 3244 в восьмеричной - это 1700 в десятичной.
А второй вариант (твой) - это просто копирование одного числа в другое, что и требовалось доказать.
Я, конечно, не супер-пупер программист, но отличить правильное решение от неправильного вполне способна. Для этого достаточно всего лишь скомпилировать код и попробовать запустить его :)
oct_num /= 10;
dig <<= 3*i;
dec_num |= dig;
Я с точки зрения математики понемаю что оно делает, но КАК оно это делает до меня просто не доходит... Возможно, я сам по себе трудный, но интересно!
ЗЫ: 1700(dec) = 3244(oct) : )
Если запустить ту программу, тогда примерно получается:
oct 5254 = dec 3244 = dec 1700
oct 5254 = dec 3244 = dec 3244
Есть например 12 битовое двоичное число 110011100101 = dec 3301.
Тогда, чтоб получить 8-ное представление, нужно просто разделить это число на триады:
110011100101 -> 110 011 100 101 -> 6345.
Твоя ф-я переводит 8-ое 06345 в десятичное 1729.
Хорошо, проверим.
#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();
}
Запускаем, смотрим результат:
Комментарии нужны?
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
Комментарии нужны?
Все правильно, за исключением одного мизера. 8-ое число начинается с 0-я.
Т.е. вместо
int oct_num = 6345;
нужно писать
int oct_num = 06345;
извини, просто не заметила что ты делишь на 10, вместо 8 :). если этот момент подправить, тогда и твоя функция будет работать. А вообще прекращайте спорить, вопрос решен.
Всем спасибо за участие :)
oct_num /= 8;
dig <<= 3*i;
dec_num |= dig
Я с точки зрения математики понемаю что оно делает, но КАК оно это делает до меня просто не доходит... Возможно, я сам по себе трудный, но интересно!
ЗЫ: 1700(dec) = 3244(oct) : )
{
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));
}
Т.е. вместо
int oct_num = 6345;
нужно писать
int oct_num = 06345;
С чего ты это взял? :D
Если написать так, как ты предлагаешь, то преобразование из восьмеричной системы в десятичную будет происходить дважды! Хочешь, покажу фокус? Запускаем программу:
#include <conio.h>
void main()
{
int oct_num = 06345;
cout << oct_num << endl;
getch();
}
И видим на экране десятичную запись числа:
Без всяких там функций oct_to_dec() и прочих. :D
Ничего исправлять не надо, функция работает правильно. Делить надо именно на 10 :)
Если делить на 8, преобразование теряет всякий смысл, ибо превращается в тупое копирование одной переменной в другую.
Преобразование может и тупое, но и в вашем варианте вижу смысла не больше, кроме тренировки мозга)). В жизни более низкого уровня числа сохраняются в стринг, а потом преобразовываются в нужный формат(СС).
Преобразование может и тупое, но и в вашем варианте вижу смысла не больше, кроме тренировки мозга)). В жизни более низкого уровня числа сохраняются в стринг, а потом преобразовываются в нужный формат(СС).
Я поняла задачу так. Дано некоторое число X, в десятичной записи которого отсутствуют цифры 8 и 9. Надо найти такое число Y, чтобы его восьмеричная запись совпадала с десятичной записью X. Например, если X = 20, то Y = 16. Если X = 21, то Y = 17, и т.д. Моя функция для каждого X находит соответствующий Y. Полезна она или нет - не мне судить, но в принципе, гипотетически можно придумать ситуацию, когда потребуется именно такое преобразование.
Ваша же функция не может быть полезна даже гипотетически, ибо она просто ничего не преобразует (или, говоря математическим языком, выполняет тождественное преобразование), т.е. она берет число X и возвращает то же самое число. Именно это я и хочу показать:
#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();
}
Честно говоря, не думала, что такую простую вещь придется доказывать так долго :(
Если в наши программы записать
int oct_num = 012345;
то они вернут 5349.
Это просто ты определяешь неграмотно 8-ричную константу.
На прилагаемом скриншоте вырезка из MSDN для Visual C++.
В ней, говорится, что для того, чтоб определить в программе константу не в десятичной СС, в качестве префикса нужно использовать символ показывающий СС этого числа.
ВСЕМ спасибо за помощь, к автору топика просьба на будущее четко формулировать задания при создании темы.