, таким образом 255 представляет собой 8 единиц в двоичной записи. , соответственно 192 представляет собой 2 единицы и нули в двоичной записи. Тогда целая маска выглядит как . В маске есть только 6 нулей, которые соответствуют внутреннему адресу компьютера. 6 битами можно закодировать компьютера, таким образом эта маска допускает 64 адреса. Но так как 2 адреса заняты (адресом сети и широковещательным), то для подсети остается только 62 адреса.
Поясню, как это скорее всего работает: Пусть A = 255.255.255.192. Пусть какой-то пакет информации поступил на адрес B, первые 26 бит которого соответствуют адресу сети C. Это можно проверить результатом операции A ^ B = C ^ A. Далее этот пакет следует перенаправить на какой-то компьютер подсети. Его адрес узнаем операцией (not A) ^ B.
Но это лишь то, как я себе представил, могу ошибаться.
Известно уравнение прямой, проходящей через две точки A(x₁,y₁) и B(x₂,y₂). Если третья точка C(x₃,y₃) лежит на этой же прямой, то после подстановки её координат уравнение обращается в тождество
Следовательно, нужно проверить, выполняется ли это тождество для заданных координат. В этом тождестве есть одна неприятная вещь: если y₂=y₁ и/или x₂=x₁, то в знаменателе получается ноль, чему компьютер уж точно не обрадуется. Поэтому такой случай надо рассмотреть отдельно, исходя из геометрического смысла. Если же y₂≠y₁ и x₂≠x₁, можно привести тождество к более удобному виду:
Поскольку координаты могут быть и не целыми, а такие нецелые ("вещественные") числа представляются в компьютере с ограниченной точностью, тождество может оказаться ложным по причине такой неточности. Для обхода такого случая будем полагать, что два значения равны друг-другу, если их разность по модулю не превышает некоторой малой величины, т.е.:
Вернемся к случаю y₂=y₁. В этом случае прямая параллельна оси Х, т.е. тогда условием принадлежности третьей точки данной прямой будет y₃=y₁ при любом х. То же можно сказать и про случай х₂=х₁, когда следует проверить, что х₃=х₁.
Если все три точки лежат на одной прямой, то у средней из них значение любой из координат должно находиться между значениями двух одноименных координат крайних точек. // PascalABC.NET 3.0, сборка 1160 от 05.02.2016 var x1,y1,x2,y2,x3,y3,p1,p2:real; on_line:boolean; begin // Без проверки считаем, что у двух любых точек // не может быть одинаковых координат Write('Координаты точки А: '); Read(x1,y1); Write('Координаты точки B: '); Read(x2,y2); Write('Координаты точки C: '); Read(x3,y3); if x3=x1 then on_line:=(x2=x1); if (not on_line) then if y3=y1 then on_line:=(y2=y1); if not on_line then begin p1:=(x3-x1)/(x2-x1); p2:=(y3-y1)/(y2-y1); on_line:=(abs(p1-p2)<1e-8) end; if on_line then begin Writeln('Точки лежат на одной прямой'); if (x2>x1) and (x2<x3) or (x2>x3) and (x2<x1) then Writeln('Точка B внутри') else if (x3>x1) and (x3<x2) or (x3>x2) and (x3<x1) then Writeln('Точка C внутри') else Writeln('Точка A внутри') end else Writeln('Точки не лежат на одной прямой') end.
Тестовое решение: Координаты точки А: 1 2.5 Координаты точки B: 3 3.5 Координаты точки C: -4 0 Точки лежат на одной прямой Точка A внутри
, соответственно 192 представляет собой 2 единицы и нули в двоичной записи.
Тогда целая маска выглядит как
.
В маске есть только 6 нулей, которые соответствуют внутреннему адресу компьютера. 6 битами можно закодировать компьютера, таким образом эта маска допускает 64 адреса. Но так как 2 адреса заняты (адресом сети и широковещательным), то для подсети остается только 62 адреса.
Поясню, как это скорее всего работает:
Пусть A = 255.255.255.192.
Пусть какой-то пакет информации поступил на адрес B, первые 26 бит которого соответствуют адресу сети C. Это можно проверить результатом операции
A ^ B = C ^ A.
Далее этот пакет следует перенаправить на какой-то компьютер подсети. Его адрес узнаем операцией (not A) ^ B.
Но это лишь то, как я себе представил, могу ошибаться.
Следовательно, нужно проверить, выполняется ли это тождество для заданных координат.
В этом тождестве есть одна неприятная вещь: если y₂=y₁ и/или x₂=x₁, то в знаменателе получается ноль, чему компьютер уж точно не обрадуется. Поэтому такой случай надо рассмотреть отдельно, исходя из геометрического смысла.
Если же y₂≠y₁ и x₂≠x₁, можно привести тождество к более удобному виду:
Поскольку координаты могут быть и не целыми, а такие нецелые ("вещественные") числа представляются в компьютере с ограниченной точностью, тождество может оказаться ложным по причине такой неточности. Для обхода такого случая будем полагать, что два значения равны друг-другу, если их разность по модулю не превышает некоторой малой величины, т.е.:
Вернемся к случаю y₂=y₁. В этом случае прямая параллельна оси Х, т.е. тогда условием принадлежности третьей точки данной прямой будет y₃=y₁ при любом х. То же можно сказать и про случай х₂=х₁, когда следует проверить, что х₃=х₁.
Если все три точки лежат на одной прямой, то у средней из них значение любой из координат должно находиться между значениями двух одноименных координат крайних точек.
// PascalABC.NET 3.0, сборка 1160 от 05.02.2016
var
x1,y1,x2,y2,x3,y3,p1,p2:real;
on_line:boolean;
begin
// Без проверки считаем, что у двух любых точек
// не может быть одинаковых координат
Write('Координаты точки А: '); Read(x1,y1);
Write('Координаты точки B: '); Read(x2,y2);
Write('Координаты точки C: '); Read(x3,y3);
if x3=x1 then on_line:=(x2=x1);
if (not on_line) then
if y3=y1 then on_line:=(y2=y1);
if not on_line then begin
p1:=(x3-x1)/(x2-x1); p2:=(y3-y1)/(y2-y1);
on_line:=(abs(p1-p2)<1e-8)
end;
if on_line then begin
Writeln('Точки лежат на одной прямой');
if (x2>x1) and (x2<x3) or (x2>x3) and (x2<x1)
then Writeln('Точка B внутри')
else
if (x3>x1) and (x3<x2) or (x3>x2) and (x3<x1)
then Writeln('Точка C внутри')
else
Writeln('Точка A внутри')
end
else
Writeln('Точки не лежат на одной прямой')
end.
Тестовое решение:
Координаты точки А: 1 2.5
Координаты точки B: 3 3.5
Координаты точки C: -4 0
Точки лежат на одной прямой
Точка A внутри