Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/88: Рейтинг темы: голосов - 88, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 11.07.2019
Сообщений: 2

Перевод из двоичной системы счисления в десятичную

11.07.2019, 23:56. Показов 17693. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,
Необходимо ввести с консоли число в бинарном формате. Перевести его в десятичный формат, записать в переменную int и вывести на экран. Необходимо использовать циклы, нельзя использования готовые методы языка Java, для перевода числа из одной системы счисления в другую.

На текущий момент имею код , но использовать math.pow запретили, подскажите как заменить и реализовать

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Itog_1 {
    public static void main(String args[]) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Введите число");
        String str = reader.readLine();
        int sum = 0, a;
        int c;
 
        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(str.length() - 1 - i);
 
            if(c == '1' || c == '0') {
                if (c == '1')
                    a = 1;
                else a = 0;
            } else {
                System.out.println("Неверный ввод!");
                break;
            }
            sum += (a * Math.pow(2, i));
        }
 
        System.out.println(""" + str + "" -> " + sum);
    }}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2019, 23:56
Ответы с готовыми решениями:

Перевод из двоичной системы в десятичную
Да, да, знаю, изобретаю велосипед, но просьба не флеймить, а помочь, ибо первый день на яве пишу и не до конца понимаю, на что компилятор...

Перевод целых неотрицательных чисел из двоичной системы счисления в десятичную систему счисления
Перевод целых неотрицательных чисел из двоичной системы счисления в десятичную систему счисления.

Перевод из двоичной системы счисления в десятичную
Я создал программу, но вот она выдает размерность введенного массива, вместо десятичного числа. Ошибки я найти не могу. Вот сам код: ...

17
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
12.07.2019, 00:28
степень двойки заменяется сдвигом:
1 << i
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
12.07.2019, 00:51
А я бы вот так сделала:
Java
1
2
3
4
5
6
String str = "101101111010101110";
int n = 0;
for (int i = str.length() - 1, j = 1; i >= 0; i--, j *= 2) {
   n += (str.charAt(i) - '0') * j;
}
System.out.println("\"" + str + "\" -> " + n);
"101101111010101110" -> 188078

Добавлено через 5 минут
Ну, еще конечно сначала бы убрала любые символы отличные от 0 и 1
1
0 / 0 / 0
Регистрация: 11.07.2019
Сообщений: 2
12.07.2019, 00:55  [ТС]
Спасибо за помощь!!!
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
12.07.2019, 03:44
Решила проверить какой код выполняется быстрее. Со сдвигом, или как у меня. Думалось, что сдвиг будет все-таки эффективнее. Но оказалось, что нет. Со сдвигом выполняется почти в два раза медленнее.

И еще выяснила такую интересную особенность: "в Java есть понятие warming, то есть разогрев. Любой метод начинает исполнятся в интерпритируемом режиме, медленно. И только через некоторое время, когда JIT поймет что участок кода используется интенсивно, он будет закомпилирован."
Следовательно, нельзя испытывать два сравниваемых кода вместе. Первое испытание длится почти на порядок дольше, чем остальные (См. результат)
Поэтому я реализовала так, каждый код испытывается отдельно от другого десять раз, и берется среднее время выполнения для каждого кода. А уже потом результаты сравниваются.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class SpeedTest {
    public static void main(String[] args) {
        SpeedTest st = new SpeedTest();
        long start, delta, sum = 0, n = 10;
        for (int i = 0; i < n; i++) {
            start = System.nanoTime();
            st.code();
            delta = System.nanoTime() - start;
            sum += delta;
            System.out.println("Испытание #" + (i + 1) + ": " + delta);
        }
        System.out.println("Среднее время выполнения: " + sum / n);
    }
    
    private void code() {
        String str = "101101111010101110";
        int n = 0;
        for (int i = str.length() - 1, j = 1; i >= 0; i--, j *= 2)
            n += (str.charAt(i) - '0') * j;
    }
    
//  private void code() {
//      String str = "101101111010101110";
//      int n = 0;
//      for (int i = 0; i < str.length(); i++) 
//          n += (str.charAt(i) - '0') * (1 << -i + str.length() - 1);
//  }
}
Bash
1
2
3
4
5
6
7
8
9
10
11
Испытание #1: 23579
Испытание #2: 3369
Испытание #3: 2887
Испытание #4: 2406
Испытание #5: 2887
Испытание #6: 2888
Испытание #7: 2406
Испытание #8: 2887
Испытание #9: 3369
Испытание #10: 3368
Среднее время выполнения: 5004


Добавлено через 1 час 1 минуту
И что еще интересно. Чем больше испытаний проводить за одно выполнение программы, тем существеннее снижается время выполнения кода в каждой итерации. Я установила 1000 испытаний и получила такие результаты по отдельным испытаниям:
Испытание #1: 13955 нс.
Испытание #100: 2888 нс.
Испытание #1000: 962 нс.
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
12.07.2019, 03:53
График времени выполнения:
Миниатюры
Перевод из двоичной системы счисления в десятичную  
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
12.07.2019, 06:47
alicesmagic3d, прочитай что такое jmh и поищи почему его используют
1
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
12.07.2019, 10:01
со сдвигом не нужно каждый раз рассчитывать показатель степени, нужно на каждой итерации на один бит сдвигать и устанавливать младший бит, если единица в строке:

Java
1
2
3
4
5
6
7
8
private void code() {
    String str = "101101111010101110";
    int n = 0;
    for (int i = 0; i < str.length(); i++) {
        n <<= 1;
        if (str.charAt(i) == '1') n++;
    }
}
2
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.07.2019, 12:16
Вряд ли это лучше предыдущего варианта, но мне прост хотелось попытаться сделать это через стрим
Java
1
2
3
4
5
6
7
        String str = "101101111010101110";
        int result = Arrays.stream(str.split("")).mapToInt(Integer::parseInt).reduce(0, (a, b) -> {
            a <<= 1;
            if (b == 1) a++;
            return a;
        });
        System.out.println(result);
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
12.07.2019, 12:23
Цитата Сообщение от Gungala Посмотреть сообщение
Arrays.stream(str.split("")).mapToInt(In teger:arseInt)
str.chars()
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.07.2019, 13:19
xoraxax, прост.chars() даёт стрим, состоящий из этих самых code points или что-то вроде того и их всё равно пришлось бы преобразовывать, поэтому я выбрал вариант, который выглядит красивше

Добавлено через 42 секунды
Не очень разумно, согласен
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
12.07.2019, 13:31
Gungala,
Java
1
2
3
4
int result = str.chars().reduce(0, (a, b) -> {
            a <<= 1;
            return a += b - '0';
        });
2
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.07.2019, 13:41
xoraxax, акей, не знал, что так можно
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
12.07.2019, 15:08
Цитата Сообщение от xoraxax Посмотреть сообщение
alicesmagic3d, прочитай что такое jmh и поищи почему его используют
Нашла здесь. Но это для меня пока еще слишком сложно. Пару абзацев осилила, а дальше ничего непонятно.
Так-то я понимаю, что мои измерения очень грубые. Но, мне думается, что их вполне достаточно чтобы сравнить время выполнения двух похожих алгоритмов, реализованных разными способами. Вариант от Lumber со сдвигом работает быстрее, чем мой со сдвигом, но немного медленнее, чем мой без сдвига. Вариант от Gungala работает в 50 раз медленнее, а в вашей редакции этот алгоритм ускоряется примерно в 8 раз.
Из статьи следует вывод, что "Замер скорости работы цикла с N итерациями подопытной функции, зачастую приводит к ошибочным суждениям". Поэтому, все мои утверждения относительно времени выполнения разных вариантов, конечно же, не претендуют на истину и не призваны никого критиковать, хоть и кажутся мне достаточно убедительными
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
12.07.2019, 15:22
ох, чёрт возьми, так '0' эт 48, тада всё понятно. А я уж подумал, что там какая-то особая байтовая магия работает
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
12.07.2019, 16:28
Таймер хоть и выдает наносекунды, но его реальная разрешающая способность гораздо хуже.

Цитата Сообщение от alicesmagic3d Посмотреть сообщение
Испытание #1: 13955 нс.
Испытание #100: 2888 нс.
Испытание #1000: 962 нс.
Эти числа говорят что разрешающая способность таймера ~481 нс
и соответственно есть большая погрешность только из-за этого.
1
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
12.07.2019, 19:28
Цитата Сообщение от Lumber Посмотреть сообщение
Таймер хоть и выдает наносекунды, но его реальная разрешающая способность гораздо хуже... разрешающая способность таймера ~481 нс
Да уж Таймер явно далек от совершенства.
0
 Аватар для Aviz__
2759 / 2066 / 509
Регистрация: 17.02.2014
Сообщений: 9,492
15.07.2019, 09:29

Не по теме:

Gungala, навеяло)

Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Helper {
 
    public static void main(String[] args) {
        printGungalaSign("01110100 01101001 01110100 01110100 01101001 01100101 01110011");
    }
 
    private static void printGungalaSign(String zeroOneStr) {
        for (String partSource : zeroOneStr.split(" ")) {
            System.out.print((char) Integer.parseInt(partSource, 2));
        }
    }
}

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.07.2019, 09:29
Помогаю со студенческими работами здесь

Перевод из двоичной системы счисления в десятичную
помогите пожалуйста)

Перевод из двоичной системы счисления в десятичную
как создать код который переводит с двоичной системы в десятичную без использования DEC и прочего?

Перевод из двоичной системы счисления в десятичную
Дана строка, изображающая двоичную запись целого числа. Вывести строку, изображающую десятичную запись этого же числа

Перевод из двоичной системы счисления в десятичную
Вкратце: сделал алгоритм перевода из 2 кода в 10. Но мне дали отворот поворот, сказав, что мой алгоритм это не программа, т.к х(i) взята с...

Перевод из двоичной системы счисления в десятичную
Переклад з двійкової системи числення в десяткову помогите написать код.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru