В данном примере разрабатывается 4-разрядный целочисленный тип данных и для него определяется ряд операций. Вам, вероятно, известно, что на ранней стадии развития вычислительной техники широко применялся тип данных для обозначения 4-разрядных двоичных величин, называвшихся полубайтами, поскольку они составляли половину байта, содержали одну шестнадцатеричную цифру и были удобны для ввода кода полубайтами с пульта ЭВМ, что в те времена считалось привычным занятием для программистов! В наше время этот тип данных применяется редко, но он по-прежнему является любопытным дополнением целочисленных типов данных в С#. По традиции полубайт обозначает целое значение без знака.
В приведенном ниже примере программы тип полубайтовых данных реализуется с помощью класса Nybble. В качестве базового для него используется тип int, но с ограничением на хранение данных от 0 до 15. В классе Nybble определяются следующие операторы.
• Сложение двух объектов типа Nybble.
• Сложение значения типа intс объектом типа Nybble.
|
|
• Сложение объекта типа Nybble со значением типа int.
• Операции сравнения: больше (>) и меньше (<).
• Операция инкремента.
• Преобразование значения типа int в объект типа Nybble.
• Преобразование объекта типа Nybble в значение типа int.
//создать полубайтовый тип 4-разрядных данных под названием Nybble.
using System;
//тип 4-разрядных данных.
class Nybble
{
int val; //базовый тип для хранения данных
public Nybble() { val = 0; }
public Nybble(int i)
{
val = i;
val = val & 0xF;//сохранить 4 младших разряда
}
//перегрузить бинарный оператор + для сложения двух обьектов типа Nybble
public static Nybble operator +(Nybble op1, Nybble op2)
{
Nybble result = new Nybble();
result.val = op1.val + op2.val;
result.val = result.val & 0xF; // сохранить 4 младших разряда
return result;
}
//перегрузить бинарный оператор + для сложения значения типа Nybble. и обьекта типа int
public static Nybble operator +(Nybble op1, int op2)
{
Nybble result = new Nybble();
result.val = op1.val + op2;
result.val = result.val & 0xF;//сохранить 4 младших разряда
return result;
}
//перегрузить бинарный оператор + для сложения значения типа int и обьекта типа Nybble.
public static Nybble operator +(int op1, Nybble op2)
{
Nybble result = new Nybble();
result.val = op1 + op2.val;
result.val = result.val & 0xF; //сохранить 4 младших разряда
return result;
}
//перегрузить оператор ++.
public static Nybble operator ++(Nybble op)
{
Nybble result = new Nybble();
result.val = op.val + 1;
result.val = result.val & 0xF; //сохранить 4 младших разряда
return result;
}
//перегрузить оператор >.
public static bool operator >(Nybble op1, Nybble op2)
{
if (op1.val > op2.val) return true;
else return false;
}
//перегрузить оператор <.
public static bool operator <(Nybble op1, Nybble op2)
{
if (op1.val < op2.val) return true;
else return false;
}
//преобразовать тип Nybble в тип int
public static implicit operator int(Nybble op)
{
return op.val;
}
//преобразовать тип int в тип Nybble.
public static implicit operator Nybble(int op)
|
|
{
return new Nybble(op);
}
}
class NybblseDemo
{
static void Main()
{
Nybble a = new Nybble(1);
Nybble b = new Nybble(10);
Nybble c = new Nybble();
int t;
Console.WriteLine("a: " + (int)a);
Console.WriteLine("b: " + (int)b);
//использовать тип Nybble в условном операторе if.
if (a < b) Console.WriteLine("a меньше b\n");
//сложить два обьекта типа Nybblt/
c = a + b;
Console.WriteLine("с после операции с = a + b: " + (int)c);
//сложить значение типа int c обьектом типа Nybble.
a += 5;
Console.WriteLine("а после операции a += 5: " + (int)a);
Console.WriteLine();
//использовать тип Nybble в выражении типа int.
t = a * 2 + 3;
Console.WriteLine("Результат вычисления выражения a * 2 + 3: " + t);
Console.WriteLine();
//продемонстрировать присваивание значения типа int и переполнение.
a = 19;
Console.WriteLine("Результат присваивания a = 19: " + (int)a);
Console.WriteLine();
//использовать тип Nybble для управления циклом.
Console.WriteLine("Управление циклом for c помощью обьекта типа Nybble.");
for (a = 0; a < 10; a++)
Console.Write((int)a + " ");
Console.WriteLine();
}
}
ГЛАВА