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

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

11.07.2019, 23:56. Показов 17622. Ответов 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__
2745 / 2054 / 507
Регистрация: 17.02.2014
Сообщений: 9,473
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru