В данном примере разрабатывается 4-разрядный целочисленный тип данных и для него определяется ряд операций. Вам, вероятно, известно, что на ранней стадии развития вычислительной техники широко применялся тип данных для обозначения 4-разрядных двоичных величин, называвшихся полубайтами, поскольку они составляли половину байта, содержали одну шестнадцатеричную цифру и были удобны для ввода кода полубайтами с пульта ЭВМ, что в те времена считалось привычным занятием для программистов! В наше время этот тип данных применяется редко, но он по-прежнему является любопытным дополнением целочисленных типов данных в С#. По традиции полубайт обозначает целое значение без знака.
В приведенном ниже примере программы тип полубайтовых данных реализуется с помощью класса Nybble
. В качестве базового для него используется тип int
, но с ограничением на хранение данных от 0 до 15. В классе Nybble
определяются следующие операторы.
• Сложение двух объектов типа Nybble.
• Сложение значения типа int с объектом типа Nybble.
• Сложение объекта типа Nybble со значением типа int.
• Операции сравнения: больше (>) и меньше (<).
• Операция инкремента.
• Преобразование значения типа int в объект типа Nybble.
• Преобразование объекта типа Nybble в значение типа int.
Перечисленных выше операций достаточно, чтобы показать, каким образом тип класса Nybble
интегрируется в систему типов С#. Но для полноценной реализации этого типа данных придется определить все остальные доступные для него операции. Попробуйте сделать это сами в качестве упражнения.
Ниже полностью приводится класс Nybble
, а также класс NybbleDemo
, демонстрирующий его применение.
// Создать полубайтовый тип 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 NybbleDemo {
static void Main() {
Nybble a = new Nybble(1);
Nybble b = new Nybble(10);
Nybble с = new Nybble();
int t;
Console.WriteLine("a: " + (int)a);
Console.WriteLine("b: " + (int)b);
Читать дальше