Двоичные, шестнадцатеричные и восьмеричные значения в mysql
Мне очень интересно работать с двоичными, шестнадцатеричными и восьмеричными системами в базе данных mysql. Прежде всего, пожалуйста, дайте мне совет, зачем они нам нужны при хранении информации, из-за тонны информации или почему?
Также, какой тип значений должен храниться в отмеченных системах?
Кроме того, здесь есть битовый оператор типа "<<"
вот пример => SELECT 50<<2 AS example;
это дает нам результат 200, кто-нибудь может объяснить, как он это вычисляет?
Спасибо за ответы:))
2 ответа
Прежде всего, пожалуйста, дайте мне совет, почему они нам нужны во время хранения информации
Компьютеры хранят данные в двоичном формате. Иногда нам полезно думать о фактических битах, которые хранятся, и в этом случае наша знакомая десятичная система может быть немного неудобной (поскольку преобразования не являются простыми); мы могли бы выписать биты полностью, но это часто слишком громоздко, поскольку даже довольно маленькие числа занимают много места для записи (например, десятичная дробь 24521
является двоичным 101111111001001
).
Вместо этого мы склонны использовать базы, которые имеют некоторую степень 2, поскольку они более компактны, чем двоичные, имея свойство, что каждая "цифра" представляет точное число бит в двоичном представлении. Например, шестнадцатеричная (основа-16) цифра представляет четыре бита ("клев") с цифрами 0
Через F
(десятичный 15
/ двоичный 1111
); восьмеричная (основание-8) цифра представляет три бита с цифрами 0
Через 7
(двоичный 111
).
Наш предыдущий пример десятичной 24521
было бы 5FC9
в шестнадцатеричном или 57711
в восьмеричном виде: начиная справа, вы можете видеть, что каждая цифра соответственно представляет 4 и 3 бита в двоичном представлении выше. Поэтому для нас (людей) (относительно) легко визуализировать двоичное представление, глядя на эти компактные представления в других базах.
Также, какой тип значений должен храниться в отмеченных системах?
Я не уверен, что вы подразумеваете под этим. Как указано выше, одинаковые значения могут быть представлены во всех этих системах. В MySQL мы можем указать двоичный литерал, добавив к нему 0b
и шестнадцатеричный литерал, добавляя к нему 0x
, MySQL не поддерживает восьмеричные литералы.
Кто-нибудь может объяснить, как он это рассчитывает?
<<
Оператор выполняет побитовое смещение влево. То есть он сдвигает биты левого операнда влево на количество мест, заданных правым операндом.
Для каждой позиции биты целого числа сдвигаются влево, значение, представленное этими битами, увеличивается в два раза. Это похоже на эффект смещения цифр слева в нашей десятичной системе, когда значения увеличиваются в десять раз (например, 50 смещенных на одну позицию влево дают 500, что в десять раз больше; в двоичном 110
(десятичное 6) сдвинуто на одну позицию влево дает 1100
(десятичное 12), что в два раза больше).
В вашем случае сдвигаются биты числа 50 (т.е. 110010
) два места слева дают 2 двукратных увеличения (т.е. четырехкратное увеличение в целом): 11001000
десятичный 200.
Ваши первые два вопроса слишком расплывчаты, чтобы ответить, но третий достаточно конкретен, и я отвечу.
<<2
сдвигает биты влево на 2 места, как описано здесь. Это эквивалент умножения 50 на 2^2:
mysql> SELECT 50<<2 AS example;
+---------+
| example |
+---------+
| 200 |
+---------+
1 row in set (0.00 sec)
mysql>
mysql> SELECT 50 * POW(2,2) AS example;
+---------+
| example |
+---------+
| 200 |
+---------+
1 row in set (0.00 sec)