Побитовые операторы в JavaScript работают с 32-битными целыми числами в их двоичном представлении.
Это представление называется «32-битное целое со знаком, старшим битом слева и дополнением до двойки».
Разберём, как устроены числа внутри подробнее, это необходимо знать для битовых операций с ними.
- Что такое двоичная система счисления, вам, надеюсь, уже известно. При разборе побитовых операций мы будем обсуждать именно двоичное представление чисел, из 32 бит.
Разделить 32-битное число на 2 16-битных — C (СИ)
Примеры представления чисел в двоичной системе:
| a = 0; // 00000000000000000000000000000000 |
| a = 1; // 00000000000000000000000000000001 |
| a = 2; // 00000000000000000000000000000010 |
| a = 3; // 00000000000000000000000000000011 |
| a = 255;// 00000000000000000000000011111111 |
Обратите внимание, каждое число состоит ровно из 32-битов.
Младший бит слева
Несмотря на то, что нам такой способ записи чисел кажется совсем обычным, бывают языки и технологии, использующие способ записи «младший бит слева», когда биты пишутся наоборот, от меньшего разряда к большему.
Именно поэтому спецификация EcmaScript явно говорит «старший бит слева».
- Дополнение до двойки — это название способа поддержки отрицательных чисел.
Двоичный вид числа, обратного данному (например,5и-5) получается путём обращения всех битов с прибавлением 1.
То есть, нули заменяются на единицы, единицы — на нули и к числу прибавляется 1. Получается внутреннее представление того же числа, но со знаком минус.
Например, вот число 314:
Чтобы получить -314, первый шаг — обратить биты числа: заменить 0 на 1, а 1 на 0:
Второй шаг — к полученному двоичному числу приплюсовать единицу, обычным двоичным сложением: 11111111111111111111111011000101 + 1 = 11111111111111111111111011000110.
Итак, мы получили:
| -314 = 11111111111111111111111011000110 |
Принцип дополнения до двойки делит все двоичные представления на два множества: если крайний-левый бит равен 0 — число положительное, если 1 — число отрицательное. Поэтому этот бит называется знаковым битом.

IP-адрес, что это такое?
Поговорим-ка мы об IP-адресах и о том как они образуются. А если быть точнее, то обсудим мы сегодня интернет протокол 4-ой версии(IPv4). Новая версия данного протокола носит имя IPv6, его обсудим чуть позже.
IP-адрес(Internet Protocol Address) — это уникальный сетевой адрес компьютера либо другого сетевого оборудования в компьютерной сети. Каждый дом или здание имеет свой адрес, который идентифицирует его. И нет двух зданий с одинаковым адресом. Так же и в компьютерной сети. У каждого компьютера или сетевого оборудования(роутеры, телефоны, сетевые принтеры) должен быть свой уникальный адрес. Ведь именно по этому адресу и приходит информация из сети. В этом то и состоит работа Internet Protocol`а: он должен выдать уникальный адрес устройству, должен обеспечивать сортировку и доставку пакетов. В каждый входящий и исходящий IPv4-пакет включены IPv4-адрес отправителя и получателя. Протокол IPv4 обеспечивает маршрутизацию этих пакетов от отправителя до получателя.
Как выглядит IP-адрес?
Каждый из нас знает как выглядит адрес дома. А как же выглядит IP-адрес компьютера? Приблизительно вот так:
Те, которые хоть раз видели ip-адрес, а видели наверное многие, скажут, что я что-то путаю. И добавят, что ip-адрес выглядит вроде этого:
На что я отвечу, то что ip-адрес выглядит вот так:
Так где же правда? Да везде! Все эти числа обозначают один и тот же ip-адрес. Самый ходовой его записью является первый. Почему? Да потому что это двоичное число и соответственно в таком виде его видят машины! Дальше идет вторая запись. Это запись уже для нас — для людей!
Побитовые операторы
Третья запись представляет адрес в десятичной форме, а четвертая — в шестнадцатеричной. 3 и 4 записи, в основном, используются только в учебниках.
Как образуется IP-адрес?
Рассмотрим первую и вторую запись. Первая запись — это число, состоящее только из двух цифр: 1 и 0. Все возможные его комбинации равны 2 в 32 степени(так как в числе 32 разряда). Отсюда следует, то что и ip-адресов может быть только 2 в 32 степени, а это 4 294 967 296 уникальных адресов. А людей уже больше 7 млрд! Именно поэтому и увидела свет новая версия интернет протокола. Но о ней будет немного позже.
Вторая запись формируется таким образом: ip-адрес в двоичном формате, делится на 4 части(октета):
00001010 00010000 00001010 10001111
Таким образом, образуются 4 числа по 8 цифр. После чего каждую часть переводят в десятичную систему счисления и получают:
Я не хочу освещать процесс перевода двоичного числа в десятичный.
Для этого можете использовать Калькулятор.
Как узнать свой IP-адрес?
Узнать какой у Вас IP-адрес не составляет труда. Для этого Вам нужно открыть командную строку и ввести в окно команду ipconfig. Там Вы сможете не только узнать свой IP-адрес, но и другую связанную информацию. Так же, Вы можете проверить свой IP-адрес на специальных сайтах, таких как 2ip.ru. И кстати, IP-адреса указанные в командной строке и на сайте могут отличаться друг от друга. Это объясняется наличие частных IP-адресов.
Двоичное преобразование адресов TCP/IP
В двоичной системе исчисления используется только две цифры: 0 и 1. Так как это система исчисления с основанием, равным 2, то каждая позиция в двоичной последовательности представляет степень двойки. Если связать это со стандартной десятичной системой исчисления, которая используется каждый день, то можно понять, что все не так плохо.
Возьмем число 201. При рассмотрении этого трехзначного числа можно заметить, что в нем присутствует разряд единиц, разряд десятков и разряд сотен. Поэтому число 201 равно 1х1+0х10+2х100. Цифра в каждом разряде умножается на степень 10 с показателем, соответствующим положению разряда. Так как двоичная система исчисления имеет основание 2, цифра каждого разряда умножается на степень двойки, соответствующую положению разряда.
Для преобразования десятичных чисел в двоичное представление, можно просто начать с единицы и продолжить удвоение числа, пока не будет достигнуто значение 128. После этого необходимо использовать последовательность нумерации из приведенной таблицы преобразования.
Теперь посмотрим, как адрес IP 10.8.32.6 преобразовывается в двоичную форму.
Использование простой таблицы для преобразования двоичных чисел
Столбцы двоичных разрядов (по основанию 2)
Вот пример техники для преобразования десятичного числа в двоичное представление.
1. Найдите наибольшее число в таблице преобразования, которое меньше или равно числу, преобразование которого необходимо выполнить (128, 64, 32, 8 и т.д.) и укажите 1 в его столбце.
2. Отнимите число из выбранной колонки от числа, преобразование которого выполняется.
3. Найдите наибольшее число в таблице преобразования, которое меньше или равно числу, оставшемуся после первого шага, и поместите 1 в столбец этого числа.
4. Отнимите число из выбранного столбца от числа, которое осталось на шаге 2.
Целое (тип данных)
Повторите шаги 3 и 4, пока разность не станет равна 0; после этого поместите 0 во все столбцы, которые не содержат 1. Вот это и будет наше двоичное число!
Для преобразования числа 10 необходимо найти в таблице самое большое число, не превышающее 10. Это будет 8, поэтому в столбец числа 8 необходимо поместить 1. После этого необходимо отнять 8 от 10. В результате получится число 2. В столбце, соответствующем числу 2, необходимо разместить 1. Результатом последней разности будет 2, поэтому для завершения преобразования во все остальные столбцы необходимо поместить 0.
Использование этой таблицы для преобразования двоичного числа в десятичное еще проще, чем преобразование десятичного числа в двоичное. Просто запишите 8-разрядное число в таблице, указывая каждый разряд в одном столбце таблицы. После этого сложите значения столбцов таблицы, которые содержат 1. Например, двоичное число 10100001 будет равно 128+32+1 или 161.
В главе 4 будет показано, как использовать бесплатную утилиту, предоставленную на сопровождающем компакт-диске, для преобразования адресов IP в разные представления. Поэтому не будем больше тратить время на двоичную арифметику и сразу перейдем к структуре адреса TCP/IP.
10.08. Раздел Локальная сеть
Теперь, когда мы знаем, что такое IP-адрес, маска подсети, идентификаторы сети и узла, полезно запомнить правила, которые следует применять при назначении этих параметров:
1. идентификатор сети не может содержать только двоичные нули или только единицы. Например, адрес 0.0.0.0 не может являться идентификатором сети;
2. идентификатор узла также не может содержать только двоичные нули или только единицы – такие адреса зарезервированы для специальных целей:
· все нули в идентификаторе узла означают, что этот адрес является адресом сети. Например, 192.168.5.0 является правильным адресом сети при использовании маски 255.255.255.0 и его нельзя использовать для адресации компьютеров,
· все единицы в идентификаторе узла означают, что этот адрес является адресом широковещания для данной сети. Например, 192.168.5.255 является адресом широковещания в сети 192.168.5.0 при использовании маски 255.255.255.0 и его нельзя использовать для адресации компьютеров;
3. идентификатор узла в пределах одной и той же подсети должен быть уникальным;
4. диапазон адресов от 127.0.0.1 до 127.255.255.254 нельзя использовать в качестве IP-адресов компьютеров. Вся сеть 127.0.0.0 по маске 255.0.0.0 зарезервирована под так называемый «адрес заглушки» (loopback), используемый в IP для обращения компьютера к самому себе.
Это легко проверить: достаточно на любом компьютере с установленным протоколом TCP/IP выполнить команду
и, если протокол TCP/IP работает, вы увидите, как ваш компьютер будет отвечать на собственные запросы.
Классовая и бесклассовая IP-адресация
Первоначальная система IP-адресации в Интернете выглядела следующим образом. Все пространство возможных IP-адресов (а это более четырех миллиардов, точнее 4 294 967 296 адресов) было разбито на пять классов, причем принадлежность IP-адреса к определенному классу определялась по нескольким битам первого октета (табл. 8.2).
Целое (тип данных)
Заметим, что для адресации сетей и узлов использовались только классы A, B и C. Кроме того, для этих сетей были определены фиксированные маски подсети по умолчанию, равные, соответственно, 255.0.0.0, 255.255.0.0 и 255.255.255.0, которые не только жестко определяли диапазон возможных IP-адресов узлов в таких сетях, но и механизм маршрутизации.

Чтобы рассчитать максимально возможное количе-ство узлов в любой IP-сети, достаточно знать, сколько битов содержится в идентификаторе узла, или, иначе, сколько нулей имеется в маске подсети. Это число используется в качестве показателя степени двойки, а затем из результата вычитается два зарезервированных адреса (сети и широковещания). Аналогичным способом легко вычислить и возможное количество сетей классов A, B или C, если учесть, что первые биты в октете уже зарезервированы, а в классе A нельзя использовать IP-адреса 0.0.0.0 и 127.0.0.0 для адресации сети.
Для получения нужного диапазона IP-адресов организациям предлагалось заполнить регистрационную форму, в которой следовало указать текущее число компьютеров и планируемый рост компьютерного парка в течение двух лет.
Первоначально данная схема хорошо работала, поскольку количество сетей было небольшим. Однако с развитием Интернета такой подход к распределению IP-адресов стал вызывать проблемы, особенно острые для сетей класса B. Действительно, организациям, в которых число компьютеров не превышало нескольких сотен (скажем, 500), приходилось регистрировать для себя целую сеть класса B. Поэтому количество доступных сетей класса B стало на глазах «таять», но при этом громадные диапазоны IP-адресов (в нашем примере – более 65000) пропадали зря.
Чтобы решить проблему, была разработана бесклассовая схема IP-адресации (Classless InterDomain Routing, CIDR), в которой не только отсутствует привязка IP-адреса к классу сети и маске подсети по умолчанию, но и допускается применение так называемых масок подсети с переменной длиной (Variable Length Subnet Mask, VLSM). Например, если при выделении сети для вышеуказанной организации с 500 компьютерами вместо фиксированной маски 255.255.0.0 использовать маску 255.255.254.0,то получившегося диапазона из 512 возможных IP-адресов будет вполне достаточно.
Оставшиеся 65 тысяч адресов можно зарезервировать на будущее или раздать другим желающим подключиться к Интернету.
Этот подход позволил гораздо более эффективно выделять организациям нужные им диапазоны IP-адресов, и проблема с нехваткой IP-сетей и адресов стала менее острой.
Дата добавления: 2014-11-25; Просмотров: 1686; Нарушение авторских прав?;
Помогите понять, каким образом происходит преобразование. Нужна схема, по которой происходит преобразование.
2 ответа 2
Для перевода чисел из десятичной системы счисления в двоичную используют так называемый "алгоритм замещения", состоящий из следующей последовательности действий:
- Делим десятичное число А на 2. Частное Q запоминаем для следующего шага, а остаток a записываем как младший бит двоичного числа.
- Если частное q не равно 0, принимаем его за новое делимое и повторяем процедуру, описанную в шаге 1. Каждый новый остаток (0 или 1) записывается в разряды двоичного числа в направлении от младшего бита к старшему.
- Алгоритм продолжается до тех пор, пока в результате выполнения шагов 1 и 2 не получится частное Q = 0 и остаток a = 1.
Статьи по настройке и администрированию Windows/Linux систем
- Полезное
- Карта сайта
- Мой сайт-визитка
Когда занимаешься настройками сетей различного масштаба и каждый день сталкиваешься с вычислениями – то такого рода шпаргалки заводить не обязательно, все и так делается на безусловном рефлексе. Но когда в сетях ковыряешься очень редко, то не всегда вспомнишь какая там маска в десятичной форме для префикса 21 или же какой адрес сети при этом же префиксе. В связи с этим я и решил написать несколько маленьких статей-шпаргалок по переводом чисел в различные системы счислений, сетевым адресам, маскам и т.п. В это части пойдет речь о переводи чисел в различные системы счислений.
Когда вы занимаетесь чем-то связанным с компьютерными сетями и ИТ, вы по любому столкнетесь с этим понятием. И как толковый ИТ-шник вам нужно разбираться в этом хотя бы чу-чуть даже если на практике вы это будете применять очень редко.
Рассмотрим перевод каждой цифры из IP-адреса 98.251.16.138 в следующие системы счислений:
- Двоичная
- Восьмеричная
- Десятичная
- Шестнадцатеричная
1.1 Десятичная
Так как цифры записаны в десятичной, перевод с десятичной в десятичную пропустим 🙂
1.1.1 Десятичная → Двоичная
Как мы знаем двоичная система счисления используется практически во всех современных компьютерах и многих других вычислительных устройствах. Система очень проста – у нас есть только 0 и 1.
Для преобразования числа с десятиной в двоичную форму нужно использовать деление по модулю 2 (т.е. целочисленное деление на 2) в результате чего мы всегда будем иметь в остатке либо 1, либо 0. При этом результат записываем справа налево. Пример все поставит на свои места:
Рисунок 1.1 – Перевод чисел из десятичной в двоичную систему
Рисунок 1.2 – Перевод чисел из десятичной в двоичную систему
Опишу деление числа 98. Мы делим 98 на 2, в результате имеем 49 и остаток 0. Далее продолжаем деление и делим 49 на 2, в результате имеем 24 с остатком 1. И таким же образом добираемся до 1-ки или 0-ка в делимом. Затем результат записываем справа налево.
1.1.2 Десятичная → Восьмеричная
Восьмеричная система – это целочисленная система счисления с основанием 8. Т.е. все числа в ней представлены диапазоном 0 – 7 и для перевода с десятичной системы нужно использовать деление по модулю 8.
Рисунок 1.3 – Перевод чисел из десятичной в восьмеричную систему
Деление аналогично 2-чной системе.
1.1.3 Десятичная → Шестнадцатеричная
Шестнадцатеричная система почти полностью вытеснила восьмеричную систему. У нее основание 16, но используются десятичные цифры от 0 до 9 + латинские буквы от A(число 10) до F(число 15). С ней вы сталкиваетесь каждый раз, когда проверяете настройки сетевого адаптера — это МАС-адрес. Так же, когда используется IPv6.
Рисунок 1.4 – Перевод чисел из десятичной в шестнадцатеричную систему
1.2 Двоичная
В предыдущем примере мы перевели все десятичные числа в другие системы счислений, одна из которых двоичная. Теперь переведем каждое число с двоичной формы.
1.2.1 Двоичная → Десятичная
Для перевода чисел с двоичной формы в десятичную нужно знать два нюанса. Первый – у каждого нолика и единички есть множитель 2 в n-й степени, при котором n увеличивается справа налево ровно на единичку. Второй – после перемножения все числа нужно сложить и мы получим число в десятичной форме. В итого у нас будет формула такого вида:
Где,
D – это число в десятичной форме, которое мы ищем;
n – количество символов в двоичном числе;
a – число в двоичной форме на n-й позиции (т.е. первый символ, второй, и т.п.);
p – коэффициент, равный 2,8 или 16 в степени n (в зависимости от системы счисления)
К примеру возьмем число 110102. Смотрим на формулу и записываем:
- Число состоит из 5 символов (n=5)
D = (1 × 2 5-1 ) + (1 × 2 5-2 ) + (0 × 2 5-3 ) + (1 × 2 5-4 ) + (0 × 2 5-5 ) = 16 + 8 + 0 + 2 + 0 = 2610
Кто привык записывать справа на лево, форму будет выглядеть так:
D = (0 × 2 5-5 ) + (1 × 2 5-4 ) + (0 × 2 5-3 ) + (1 × 2 5-2 ) + (1 × 2 5-1 ) = 0 + 2 + 0 + 8 + 16 = 2610
Но, как мы знаем, от перестановки слагаемых сумма не меняется. Давайте теперь переведем наши числа в десятичную форму.
Рисунок 1.5 – Перевод чисел из двоичной в десятичную систему
1.2.2 Двоичная → Восьмеричная
При переводе нам нужно двоичное число разбить на группы по три символа справа налево. Если последняя группа не состоит из трех символов, то мы просто возмещаем недостающие биты ноликами. К примеру:
10101001 = 0 10 101 001
1011100 = 00 1 011 100
Каждая группа битов – это одно из восьмеричных чисел. Чтобы узнать какое, нужно использовать написанную выше формулу 1.2.1 для каждой группы битов. В результате мы получим.
Рисунок 1.6 – Перевод чисел из двоичной в восьмеричную систему
1.2.3 Двоичная → Шестнадцатеричная
Здесь нам нужно двоичное число разбивать на группы по четыре символа справа налево с последующим дополнением недостающих битов группы ноликами, как писалось выше. Если последняя группа состоит из ноликов, то их нужно игнорировать.
110101011 = 000 1 1010 1011
1011100 = 0 101 1100
001010000 = 00 0101 0000 = 0101 0000
Каждая группа битов – это одно из шестнадцатеричных чисел. Используем формулу 1.2.1 для каждой группы битов.
Рисунок 1.7 – Перевод чисел из двоичной в шестнадцатеричную систему
1.3 Восьмеричная
В этой системе у нас могут возникнуть сложности только при переводе в 16-ричную систему, так как остальной перевод проходит гладко.
1.3.1 Восьмеричная → Двоичная
Каждое число в восьмеричной системе – это группа из трех битов в двоичной системе, как писалось выше. Для перевода нам нужно воспользоваться табличкой-шпаргалкой:
Рисунок 1.8 – Шпора по переводу чисел из восьмеричной системы
Используя эту табличку переведем наши числа в двоичную систему.
Рисунок 1.9 – Перевод чисел из восьмеричной в двоичную систему
Немного опишу вывод. Первое число у нас 142, значит будет три группы по три бита в каждой. Юзаем шпору и видим, что цифра 1 это 001, цифра 4 это 100 и цифра 2 это 010. В результате имеем число 001100010.
1.3.2 Восьмеричная → Десятичная
Здесь мы используем формулу 1.2.1 только с коэффициентом 8 (т.е. p=8). В результате имеем
Рисунок 1.10 – Перевод чисел из восьмеричной в десятеричную систему
Возьмем первое число. Исходя из формулы 1.2.1:
- Число состоит из 3 символов (n=3)
В результате имеем:
D = (1 × 8 3-1 ) + (4 × 8 3-2 ) + (2 × 8 3-3 ) = 64 + 32 + 2 = 9810
1.3.3 Восьмеричная → Шестнадцатеричная
Как писалось раньше, для перевода нам нужно сначала перевести числа в двоичную систему, потом с двоичной в шестнадцатеричную, поделив на группы по 4-ре бита. Можно использовать следующею шпору.
Рисунок 1.11 – Шпора по переводу чисел из шестнадцатеричной системы
Эта табличка поможет перевести из двоичной в шестнадцатеричную систему. Теперь переведем наши числа.
Рисунок 1.12 – Перевод чисел из восьмеричной в шестнадцатеричную систему
1.4 Шестнадцатеричная
В этой системе та же проблема, при переводе в восьмеричную. Но об этом позже.
1.4.1 Шестнадцатеричная → Двоичная
Каждое число в шестнадцатеричной системе – это группа из четырех битов в двоичной системе, как писалось выше. Для перевода нам можно воспользоваться табличкой-шпаргалкой, которая находиться выше. В результате:
Рисунок 1.13 – Перевод чисел из шестнадцатеричной в двоичную систему
Возьмем первое число – 62. Используя табличку (рис. 1.11) мы видим, что 6 это 0110, 2 это 0010, в результате имеем число 01100010.
1.4.2 Шестнадцатеричная → Десятичная
Здесь мы используем формулу 1.2.1 только с коэффициентом 16 (т.е. p=16). В результате имеем
Рисунок 1.14 – Перевод чисел из шестнадцатеричной в десятеричную систему
Возьмем первое число. Исходя из формулы 1.2.1:
- Число состоит из 2 символов (n=2)
В результате имеем.
D = (6 × 16 2-1 ) + (2 × 16 2-2 ) = 96 + 2 = 9810
1.4.3 Шестнадцатеричная → Восьмеричная
Для перевода в восьмеричную систему нужно сначала перевести в двоичную, затем разбить на группы по 3-и бита и воспользоваться табличкой (рис. 1.8). В результате:
Рисунок 1.15 – Перевод чисел из шестнадцатеричной в восьмеричную систему
В следующей статье пойдет речь о IP-адресах, масках и сетях.