Страницы

Поиск по вопросам

Показаны сообщения с ярлыком информатика. Показать все сообщения
Показаны сообщения с ярлыком информатика. Показать все сообщения

воскресенье, 8 марта 2020 г.

Вопрос по переводу чисел между системами счисления

#математика #информатика


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


Ответы

Ответ 1



Если я правильно понимаю ваш вопрос, то, скорее всего, у вас когнитивный диссонанс :) из-за того, что вы выполняете перевод из двоичной в десятичную - ну, типа, 110101 = 1 + 4 + 16 + 32 = 53, и забываете о том, что вы уже работаете в десятичной записи. И на этом ваше преобразование завершено. Давайте иначе - через, ну, скажем, семеричную. Тогда 110101 = 1 + 4 + 22 + 44 = 104 Если бы вы работали в семеричной системе счисления, вы бы это 104 считали ответом и больше ничего не делали. Разве что задали бы здесь вопрос - и чем же семеричная система счисления такая выдающаяся? :) А теперь нужно 104 перевести в десятичную... Делим 104 на 13 (10 в семеричной), получаем 5, и в остатке 3, итого записываем в десятичной 53... Это ответ на ваш вопрос?

Ответ 2



Методы одинаковые и ничем не отличаются. 12345 dec = 30071 oct 12345 divrem 8 = 1543 1 1543 divrem 8 = 192 7 192 divrem 8 = 24 0 24 divrem 8 = 3 0 3 divrem 8 = 0 3 0o30071 divrem 10 = 0o2322 5 0o2322 divrem 10 = 0o173 4 0o173 divrem 10 = 0o14 3 0o14 divrem 10 = 0o1 2 0o1 divrem 10 = 0o0 1 Десятичная обусловлена исторически 10 пальцами на руках. А вообще, можно почитать :)

пятница, 10 января 2020 г.

с чего начать разработку эмулятора процессора?

#java #ассемблер #информатика #cpu


Передо мной стоит вот такая задача: 
Разработать эмулятор процессора, создать для него язык ассемблера и написать несколько
программ. Нужно придумать свою архитектуру CPU и придумать ряд команд, почитайте про
современные архитектуры и например наборы команд SSE и AVX.

Помогите пожалуйста разобраться. Я понял так(хотя понимание пока очень поверхностное): 
Мне не надо напрямую возиться с регистрами и все такое? Главное на логическом уровне
все правильно сделать а не физическом? То есть можно взять любой ЯП, например Java,
и на нем писать процессор? Он не будет иметь ничего общего с физическими процессорами,
но по логике будем им соответствовать.  То есть у нас может быть программа, в которой
создан массив - наша эмуляция памяти, например так:  long[] memory = new long[1024
* 1024]. Еще один массив - эмулирет регистры. Наша основная программа стартует, создаются
оба массива, дальше она начинает считывать из заранее заготовленного файла по одной
строке. А вот в файле мы заранее напишем нашу систему команд - Логические - and, or,
not, xor. Численные - add, sub, mul, div. Программа будет их считывать и выполнять.
То есть в основной функции программы, которая считывает и выполняет команды, можно
будет написать switch если add -> складываем, если mul ->  умножаем  и т.д. Подскажите
пожалуйста, хотя бы направление мыслей правильное?
    


Ответы

Ответ 1



В целях обучения лучше взять простой процессор, который имеет задатки и много общего с реальными, но не настоящий - это 100%. В железе будет много оптимизации, которую вы не поймете и ограничений из-за жестокого реального мира, который не дает реализовать все так просто, как хотелось бы в теории. Нам профессор показал, как от простых бинарных операций дойти до С++. В конце (все кто сдали) с легкостью доказывали инвариантность С++ программ и логических состояний процессора по шагам. Но, боюсь, что без толкового преподавателя вам не обойтись. Посмотрите на этот пример, что бы просто понять, что такое ALU, вам нужно неплохо разбираться в дискретной математике. Работа с памятью не возможна без MUX DEMUX и знаний о них, что такое стэк и где хранится OP и т.д. Языки - это отдельная тема и очень обширная. Посмотрите на Computation Structures - Part 1 и Computation Structures - Part 2, я уверен - эти курсы дадут вам на порядок больше, нежели чем вы сами будете блуждать в бессистемных статьях вики и уж тем более тут. При все моем уважение к этому проекту, он абсолютно не академичен да и не стремится к этому. З.Ы. Вот тут хороший набор команд - из моих реликвий )

суббота, 28 декабря 2019 г.

как подсчитать минимальное количество битов требуемое для десятичных чисел в бинарном коде?

#информатика #системы_счисления


как подсчитать минимальное количество битов требуемое для десятичных чисел в бинарном
коде?
Например: 270 или 520
    


Ответы

Ответ 1



Для целых чисел без знака: взять логарифм по основанию 2 и округлить в большую сторону. n = log2(x+1) log2271 = 8.082 -> 9 бит log2521 = 9.025 -> 10 бит Для представления нуля в памяти всё равно требуется хотя бы 1 бит

Ответ 2



Если уж говорить о скорости, то некоторые архитектуры (в т.ч. x86) имеют инструкцию, которая считает количество лидирующих нулевых бит. Компилятор GCC имеет её встроенный аналог (обёртку). #include int main() { std::cout << 32 - __builtin_clz( 270 ) << std::endl; // 9 std::cout << 32 - __builtin_clz( 520 ) << std::endl; // 10 std::cout << 32 - __builtin_clz( 511 ) << std::endl; // 9 std::cout << 32 - __builtin_clz( 512 ) << std::endl; // 10 }

Ответ 3



Делим на 2, пока получается число большее единицы, считаем итерации, к результату добавляем 1. Добавляем ещё 1, если число отрицательное.

Ответ 4



Предварительно генерируем массив степеней двойки. Cравниваем число со степенями из массива, пока не найдём первое превышающее. Индекс этого числа и есть искомый размер. Вот код и тесты: import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) public class Algorithms { public static int[] powersOfTwo = new int[31]; static { powersOfTwo[0] = 1; for (int power = 1; power < powersOfTwo.length; power++) { powersOfTwo[power] = powersOfTwo[power - 1] * 2; } } @Parameterized.Parameter(0) public int number; @Parameterized.Parameter(1) public int size; @Parameterized.Parameters(name = "number:{0}, size:{1}") public static Collection data() { return Arrays.asList(new Object[][]{ {0, 1}, {1, 1}, {3, 2}, {((int) Math.pow(2, 10)) - 1, 10}, {((int) Math.pow(2, 10)), 10}, {((int) Math.pow(2, 10)) + 1, 11}, {Integer.MAX_VALUE, 31} }); } public static int getSizeOf(int number) { for (int power = 1; power < 30; power++) { if (powersOfTwo[power] >= number) return power; } return 31; } @Test public void testSizeOf() { Assert.assertEquals(size, getSizeOf(number)); } } Этот алгоритм должен быть быстрее, чем вычисление логарифмов или деление.

среда, 18 декабря 2019 г.

Как определить основание системы счисления числа?

#математика #информатика #системы_счисления


118924 в 10 системе счисления = 350214 в х системе счисления, как найти х? если можно
то попродобнее    


Ответы

Ответ 1



Это ж всё брутфорс, это ж несерьезно :) На самом деле, конечно, перебор здесь вполне подходит, и можно дать ему границы сразу — по количеству цифр, по максимальной цифре. Но есть же и аналитический метод. 350214х = 11892410 Это означает, что 3x5 + 5x4 + 0x3 + 2x2 + 1x + 4 = 11892410 или 3x5 + 5x4 + 2x2 + x – 118920 = 0 Классический многочлен пятой степени. И теперь нужно просто решить полиномиальное уравнение. По основной теореме алгебры у него будет пять комплексных корней, нас, правда, интересует только действительный, хорошо бы положительный, и хорошо бы целый :) Из теоремы Абеля-Руффини известно, что аналитически мы такое уравнение не решим в общем случае, но я бы даже и пробовать не стал: на то придуманы численные методы, которых всяких есть многатыщ — выбрать можно по вкусу, начиная хоть с метода товарища Ньютона. Решаем, и получаем: x = 8 Хорошо и красиво. Ну можете еще добить преподавателя комплексными корнями, сказав, что это же число записывается точно так же в системе счисления с основанием (-7.07949 - 4.865i) :)

Ответ 2



Что бы перевести число с какой то системы счисления с основой Х в десятичную, нужно делать так: 1) начальная сумма 0 2) текущая цифра - самая первая 3) текущую сумму умножаем на основу Х 4) добавляем текущую цифру к сумме. 5) если справа ещё есть цифры - к пункту 3 иначе выход Так как вручную проверять все это лень, пишется небольшая программа, к примеру на питоне def r(x): return (((((3 * x + 5) * x + 0) * x + 2) * x + 1) * x + 4) for i in range(6,10): print i, r(i) Начинаем с 6, так как все цифры в заданном числе точно меньше 6 и это будет минимально возможная основа. А верхняя 9, так как "визуально" число в системе счисления Х больше его записи в десятичной форме. и конечный ответ - 8.

Ответ 3



Топовый ответ прекрасен. Осталось только уточнить решение. Итак, получено уравнение 3*x5 + 5*x4 + 2*x2 + x – 118920 = 0. И есть следующие соображения к его решению: x - основание системы счисления, т.е. целое число. В записи числа встречается цифра 5, т.е. x>5. Число в искомой системе счисления выглядит больше нежели в десятичной, т.е. x<10. Все целочисленные решения степенного уравнения являются делителями его свободного члена, и после проверки остаётся только x=8. Подстановка в уравнение показывает, что это ответ.

Ответ 4



Попробуй перебором. Начни с 6-ти разрядной системы счисления

Ответ 5



"Оптимизированный" перебор мог бы выглядеть так (Java): public static int getNotation(int decBased, int[] xBased) { outer: for (int base = 6; ; base++) { // как определить нижнюю границу вы уже знаете int tmp = decBased; int i = xBased.length - 1; while (tmp != 0) { int integral = tmp / base; int part = tmp % base; if (xBased[i] == part) { tmp = integral; i--; } else { continue outer; // отбрасываем основание, как только остаток от деления не равен соответствующей цифре чисда } } return base; } } Набросал по-быстрому и грязновато, но, наверно, суть понятна. Алгоритм основан на переводе числа в Википедии.

четверг, 12 декабря 2019 г.

В чём разница между ГБ и ГиБ?

#информатика


В чём разница между единицами измерения информации ГБ и ГиБ?
    


Ответы

Ответ 1



гигабайт GB 1000000000 байт гибибайт GiB 1073741824 байт

Ответ 2



Разницы на самом деле две. Первая из них, как и отмечено в принятом ответе, состоит в том, что термины «килобайт», «мегабайт» и «гигабайт» по рекомендации IEC должны означать соответственно 1000, 1 000 000 и 1 000 000 000 байт. В отличие от них, термины «кибибайт», «мебибайт» и «гибибайт» должны означать 1024, 1024² = 1 048 576 и 1024³ = 1 073 741 824 байт. В реальности же (и в этом состоит вторая разница), «би»-варианты практически не применяются, и в повседневном общении килобайт, мегабайт и гигабайт означают чаще всего (но не всегда) именно 1024, 1024² и 1024³ байт. Это создаёт путаницу, но термины наподобие «кибибайт» настолько неблагозвучны, что с этой путаницей приходится жить дальше. Тем не менее, производители дисковых накопителей и чипов оперативной памяти часто используют для обозначения ёмкости своих устройств традиционные единицы («гигабайт»), употребляя их в смысле рекомендации IEC (то есть, у них 1 Гб = 1 000 000 000 байт). Критики утверждают, что это делается не столько для поддержки стандартизации, сколько из маркетинговых соображений.

воскресенье, 26 мая 2019 г.

Вопрос по переводу чисел между системами счисления

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


Ответ

Если я правильно понимаю ваш вопрос, то, скорее всего, у вас когнитивный диссонанс :) из-за того, что вы выполняете перевод из двоичной в десятичную - ну, типа, 110101 = 1 + 4 + 16 + 32 = 53, и забываете о том, что вы уже работаете в десятичной записи. И на этом ваше преобразование завершено.
Давайте иначе - через, ну, скажем, семеричную. Тогда 110101 = 1 + 4 + 22 + 44 = 104
Если бы вы работали в семеричной системе счисления, вы бы это 104 считали ответом и больше ничего не делали. Разве что задали бы здесь вопрос - и чем же семеричная система счисления такая выдающаяся? :)
А теперь нужно 104 перевести в десятичную... Делим 104 на 13 (10 в семеричной), получаем 5, и в остатке 3, итого записываем в десятичной 53...
Это ответ на ваш вопрос?

понедельник, 29 октября 2018 г.

Как определить основание системы счисления числа?

118924 в 10 системе счисления = 350214 в х системе счисления, как найти х? если можно то попродобнее


Ответ

Это ж всё брутфорс, это ж несерьезно :) На самом деле, конечно, перебор здесь вполне подходит, и можно дать ему границы сразу — по количеству цифр, по максимальной цифре. Но есть же и аналитический метод. 350214х = 11892410 Это означает, что 3x5 + 5x4 + 0x3 + 2x2 + 1x + 4 = 11892410 или 3x5 + 5x4 + 2x2 + x – 118920 = 0 Классический многочлен пятой степени. И теперь нужно просто решить полиномиальное уравнение. По основной теореме алгебры у него будет пять комплексных корней, нас, правда, интересует только действительный, хорошо бы положительный, и хорошо бы целый :) Из теоремы Абеля-Руффини известно, что аналитически мы такое уравнение не решим в общем случае, но я бы даже и пробовать не стал: на то придуманы численные методы, которых всяких есть многатыщ — выбрать можно по вкусу, начиная хоть с метода товарища Ньютона. Решаем, и получаем: x = 8 Хорошо и красиво. Ну можете еще добить преподавателя комплексными корнями, сказав, что это же число записывается точно так же в системе счисления с основанием (-7.07949 - 4.865i) :)