Что такое «Дополнение 2»?

В качестве альтернативы можно полагаться на декартово произведение, предоставляемое itertools: itertools.product, что позволяет избежать создания временного ключа или изменения индекса:

import numpy as np 
import pandas as pd 
import itertools

def cartesian(df1, df2):
    rows = itertools.product(df1.iterrows(), df2.iterrows())

    df = pd.DataFrame(left.append(right) for (_, left), (_, right) in rows)
    return df.reset_index(drop=True)

Быстрая проверка:

In [46]: a = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"])

In [47]: b = pd.DataFrame(np.random.rand(5, 3), columns=["d", "e", "f"])    

In [48]: cartesian(a,b)
Out[48]:
           a         b         c         d         e         f
0   0.436480  0.068491  0.260292  0.991311  0.064167  0.715142
1   0.436480  0.068491  0.260292  0.101777  0.840464  0.760616
2   0.436480  0.068491  0.260292  0.655391  0.289537  0.391893
3   0.436480  0.068491  0.260292  0.383729  0.061811  0.773627
4   0.436480  0.068491  0.260292  0.575711  0.995151  0.804567
5   0.469578  0.052932  0.633394  0.991311  0.064167  0.715142
6   0.469578  0.052932  0.633394  0.101777  0.840464  0.760616
7   0.469578  0.052932  0.633394  0.655391  0.289537  0.391893
8   0.469578  0.052932  0.633394  0.383729  0.061811  0.773627
9   0.469578  0.052932  0.633394  0.575711  0.995151  0.804567
10  0.466813  0.224062  0.218994  0.991311  0.064167  0.715142
11  0.466813  0.224062  0.218994  0.101777  0.840464  0.760616
12  0.466813  0.224062  0.218994  0.655391  0.289537  0.391893
13  0.466813  0.224062  0.218994  0.383729  0.061811  0.773627
14  0.466813  0.224062  0.218994  0.575711  0.995151  0.804567
15  0.831365  0.273890  0.130410  0.991311  0.064167  0.715142
16  0.831365  0.273890  0.130410  0.101777  0.840464  0.760616
17  0.831365  0.273890  0.130410  0.655391  0.289537  0.391893
18  0.831365  0.273890  0.130410  0.383729  0.061811  0.773627
19  0.831365  0.273890  0.130410  0.575711  0.995151  0.804567
20  0.447640  0.848283  0.627224  0.991311  0.064167  0.715142
21  0.447640  0.848283  0.627224  0.101777  0.840464  0.760616
22  0.447640  0.848283  0.627224  0.655391  0.289537  0.391893
23  0.447640  0.848283  0.627224  0.383729  0.061811  0.773627
24  0.447640  0.848283  0.627224  0.575711  0.995151  0.804567
397
задан 9 revs, 7 users 46% 11 January 2017 в 02:21
поделиться

6 ответов

Я всегда просто смотрю на SHOW CREATE TABLE mydatabase.mytable .

Для базы данных, похоже, вам нужно посмотреть SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema. SCHEMATA .

Я назову его полубайт - 1/2 байта).

  • 0000 - ноль
  • 0001 - один
  • 0010 - два
  • 0011 - от трех
  • 0100 до 0111 - от четырех до семи

Это все, что мы можем зайти в положительных результатах. 2 3 -1 = 7.

Для отрицательных:

  • 1111 - отрицательных
  • 1110 - отрицательных двух
  • 1101 - отрицательных трех
  • 1100 до 1000 - от четырех до восьми

Обратите внимание, что вы получаете одно дополнительное значение для отрицательных значений ( 1000 = -8), которое не используется для положительные. Это потому, что 0000 используется для нуля. Это можно рассматривать как числовую строку компьютеров.

Различение положительных и отрицательных чисел

При этом первый бит получает роль символа " где, как если бы самый старший бит (крайний левый) равен 0 , вы можете сказать, что десятичное значение положительное.

Отрицательные числа «комплимент для одного» просто меняют знаковый бит, а затем отсчитывают от 0. Но этот подход связан с интерпретацией 1000 как «отрицательного нуля», что сбивает с толку. Обычно об этом нужно беспокоиться только при работе рядом с оборудованием.

где, как если бы самый старший бит (крайний левый) равен 0 , вы можете сказать, что десятичное значение положительное.

Отрицательные числа «комплимент для одного» просто меняют знаковый бит, а затем отсчитывают от 0. Но этот подход связан с интерпретацией 1000 как «отрицательного нуля», что сбивает с толку. Обычно об этом нужно беспокоиться только при работе рядом с оборудованием.

595
ответ дан 22 November 2019 в 23:30
поделиться

2's дополнение является по существу способом придумать аддитивную инверсию двоичного числа. Спросите себя это: Учитывая число в двоичной форме, что комбинация двоичных разрядов при добавлении к исходному числу сделает нуль результата? Если можно придумать эту комбинацию двоичных разрядов затем, что комбинация двоичных разрядов является-ve представлением (аддитивная инверсия) исходного числа; поскольку по определению добавление числа к его аддитивной инверсии должно всегда приводить к нулю. Пример: возьмите 101, который является десятичный 5. Теперь задача состоит в том, чтобы придумать немного шаблона, который при добавлении к данной комбинации двоичных разрядов (101) приведет к нулю. Чтобы сделать это, запустите с права большую часть бита 101 и для каждого отдельного бита, снова задайте тот же вопрос: Какой бит я должен добавить к "этому" биту для создания нуля результата? продолжите делать то взятие в учетной записи обычный перенос. После того, как мы сделаны с 3 правами большинство мест (цифры, которые определяют исходное число без учета к начальным нулям), последний перенос входит в комбинацию двоичных разрядов аддитивной инверсии. Кроме того, так как мы могли держать в исходном числе в, говорят, что единственный байт, все другие ведущие биты в аддитивной инверсии должны также быть 1's так, чтобы, когда компьютер добавляет число и его аддитивную инверсию с помощью "того" типа хранения (символ), результатом в том символе были бы все нули.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0
0
ответ дан 22 November 2019 в 23:30
поделиться

В простом термине 2's Complement способ сохранить отрицательное число в Памяти компьютера. Принимая во внимание, что Положительные числа хранятся как Нормальное Двоичное число.

Позволяют нам полагать, что этот пример,

Компьютерное использование Binary Number System представляет любое число.

x = 5;

Это представлено как 0101.

x = -5;

, Когда компьютерный encouters - знак, это вычисляет, это - 2 дополнение и хранит его. i.e 5 = 0101 и это 2, дополнение 1011.

Важное компьютерное использование правил для обработки чисел,

  1. , Если первый бит 1 затем, это должно быть negative число.
  2. , Если все биты кроме первого бита 0 затем, это - положительное число, потому что нет никакого -0 в системе счисления. (1000 is not -0 вместо этого это положительно 8)
  3. , Если все биты 0 затем, это 0.
  4. Еще это positive number.
0
ответ дан 22 November 2019 в 23:30
поделиться

Представьте, что у вас есть конечное число битов / тритов / цифр / чего угодно. Вы определяете 0 как все цифры, равные 0, и естественным образом считаете вверх:

00
01
02
..

В конце концов, вы переполнитесь.

98
99
00

У нас есть две цифры, и мы можем представить все числа от 0 до 100. Все эти числа положительные! Предположим, мы тоже хотим представлять отрицательные числа?

На самом деле у нас есть цикл. Число перед 2 - 1. Число перед 1 - 0. Число перед 0 - это ... 99 .

Итак, для простоты предположим, что любое число больше 50 отрицательно. «0» - «49» представляют от 0 до 49. «99» равно -1, «98» равно -2, ... «50» равно -50.

Это представление является десятичным дополнением . Компьютеры обычно используют дополнение до двух , что то же самое, за исключением использования битов вместо цифр.

Хорошая особенность дополнения до десяти состоит в том, что сложение просто работает . Для сложения положительных и отрицательных чисел ничего особенного делать не нужно!

14
ответ дан 22 November 2019 в 23:30
поделиться

Интересно, можно ли это объяснить лучше, чем статья в Википедии.

Основная проблема, которую вы пытаетесь решить с помощью представления с дополнением до двух, - это проблема хранения отрицательных целых чисел.

Сначала рассмотрим целое число без знака, хранящееся в 4 битах. У вас могут быть следующие

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Они беззнаковые, потому что нет указания, отрицательные они или положительные.

Величина знака и избыточное обозначение

Чтобы сохранить отрицательные числа, вы можете попробовать ряд вещей. Во-первых, вы можете использовать обозначение величины знака, которое назначает первый бит как знаковый бит для представления +/-, а остальные биты - для представления величины. Итак, снова используя 4 бита и предполагая, что 1 означает -, а 0 означает +, у вас есть

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Итак, вы видите проблему? У нас есть положительный и отрицательный 0. Более серьезная проблема - это сложение и вычитание двоичных чисел. Схемы сложения и вычитания с использованием знаковых величин будут очень сложными.

Что такое

0010
1001 +
----

?

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

Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.

Преобразование десятичного числа в дополнение до двух

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

    Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.

    Преобразование десятичного числа в дополнение до двух

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

      Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.

      Преобразование десятичного числа в дополнение до двух

      1. Преобразование числа в двоичное (пока игнорируйте знак) например, 5 - 0101, а -5 - 0101

      2. Если число положительное, то все готово. например, 5 - это 0101 в двоичной системе с использованием записи дополнения до двух.

      3. Если число отрицательное, то

        3.1 найти дополнение (инвертировать нули и единицы) например, -5 равно 0101, поэтому нахождение дополнения равно 1010

        3.2 Добавьте 1 к дополнению 1010 + 1 = 1011. Следовательно, -5 в дополнительном двоичном коде составляет 1011.

      Итак, что, если вы хотите получить 2 + (-3) в двоичном формате? 2 + (-3) равно -1. Что бы вы сделали, если бы складывали эти числа с помощью знаковой величины? 0010 + 1101 =?

      Используя дополнение до двух, подумайте, насколько это было бы легко.

       2  =  0010
       -3 =  1101 +
       -------------
       -1 =  1111
      

      Преобразование двойного дополнения в десятичное

      Преобразование 1111 в десятичное:

      1. Число начинается с 1, поэтому оно отрицательное, поэтому мы находим дополнение к 1111, то есть 0000.

      2. Добавьте 1 к 0000, и мы получим 0001.

      3. Преобразуем 0001 в десятичное, что равно 1.

      4. Примените знак = -1.

      Tada!

327
ответ дан 22 November 2019 в 23:30
поделиться

I liked lavinio's answer, but shifting bits adds some complexity. Often there's a choice of moving bits while respecting the sign bit or while not respecting the sign bit. This is the choice between treating the numbers as signed (-8 to 7 for a nibble, -128 to 127 for bytes) or full-range unsigned numbers (0 to 15 for nibbles, 0 to 255 for bytes).

2
ответ дан 22 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: