Двоичные, шестнадцатеричные и восьмеричные значения в mysql

Мне очень интересно работать с двоичной, шестнадцатеричной и восьмеричной системами в базе данных mysql. Прежде всего, дайте мне совет, зачем они нам нужны при хранении информации, из-за тонны информации или почему?

Кроме того, какие типы значений должны храниться в отмеченных системах?

Кроме того, здесь есть битовый оператор типа "‹‹"

вот пример => SELECT 50<<2 AS example;

это дает нам результат 200, кто-нибудь может объяснить, как он его вычисляет?

Спасибо за ответы :))


person nanobash    schedule 16.05.2012    source источник
comment
Также см. stackoverflow.com/q/4256657/632951.   -  person Pacerier    schedule 26.01.2015


Ответы (2)


Прежде всего, дайте мне совет, зачем они нам нужны при хранении информации

Компьютеры хранят данные в двоичном формате. Иногда нам полезно думать с точки зрения фактических битов, которые хранятся, и в этом случае наша знакомая десятичная система может быть немного неудобной (поскольку преобразования не являются прямыми); мы могли бы записать биты полностью, но часто это слишком громоздко, поскольку даже очень маленькие числа занимают много места для записи (например, десятичное 24521 является двоичным 101111111001001).

Вместо этого мы склонны использовать основания, которые являются некоторой степенью двойки, поскольку они более компактны, чем двоичные, но при этом обладают тем свойством, что каждая «цифра» представляет точное количество битов в двоичном представлении. Например, шестнадцатеричная (с основанием 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.

person eggyal    schedule 16.05.2012
comment
Я также читал подобное объяснение для нашего примера => Битовые операторы работают с двоичными представлениями значений. Двоичное представление значения 50 равно 110010. С помощью оператора ‹‹ биты сдвигаются на несколько позиций влево, а в конце ставятся нули. В предыдущем выражении значение 110010 сдвинуто на два бита влево, что дает 11001000. В десятичной системе это значение равно 200. Я вижу, что два 00 добавляются слева от 110010, и мне интересно, почему нули а не добавленные? - person nanobash; 17.05.2012
comment
@Tomike: прочитав ваш комментарий, я теперь понимаю, о чем вы спрашиваете. Ответ прост: именно так определяется операция сдвига влево. - person eggyal; 17.05.2012

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

<<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)
person Ike Walker    schedule 16.05.2012
comment
так что, если, несмотря на 2, это будет, например, 4, он сдвинет биты влево на 4 места? - person nanobash; 17.05.2012
comment
Правильный. Попробуйте, и вы убедитесь в этом сами. - person Ike Walker; 17.05.2012