Прямий код числа
При записі числа в прямому коді старший розряд є знаковим розрядом. Якщо його значення дорівнює 0 – то число додатне, якщо 1 – то від’ємне. В інших розрядах ( які наз. Цифровими розрядами ) записується двійкове представлення модуля числа.
Функція кодування двійкових чисел (в тому числі цілих і змішаних дробів) в прямому коді має вигляд:
де n – номер знакового розряду. При кодуванні правильних двійкових дробів (тобто чисел – 1 < A < 1), n=0 і функція кодування приймає вигляд:
Величина числа А в прямому коді знаходиться по наступній формулі:
:
asign — значення знакового розряду
число A має k розрядів справа от коми (дробова частина) и n розрядів зліва (ціла частина), тут враховується тільки цифрові розряди.
Як видно із останньої формули, знаковий розряд в прямому коді не має розрядної ваги. При виконанні арифметичних операцій це призводить до необхідності окремої обробки знакового розряду в прямому коді.
Код програми
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e) {
textBox3.Text = BynaryMaster.Deduction(textBox1.Text, textBox2.Text);
}
private void textBox4_TextChanged(object sender, EventArgs e) {
textBox5.Text = BynaryMaster.Convert(textBox4.Text,5,8);
textBox6.Text = BynaryMaster.Convert(textBox4.Text, 8, 5);
}
private void label2_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
public static class BynaryMaster {
public static string Deduction(string First, string Second) {
string result = "";
//перевырка на правильнысть вхыдних даних
if(BadValue(First) | (BadValue(Second)))
return "Неправильні аргументи";
First = Add32Symbols(First);
Second = Add32Symbols(Second);
//перетвор в зворотный код другого числа
Second = Complementary(Second);
result = Addition(First, Second);
return result;
}
private static string Addition(string First, string second) {
string result = "";
int f = 0, s = 0, mem = 0, tempRes = 0;
for(int i = 31;i >= 0;i--) {
f = ((int)First[i] - 48);
s = ((int)second[i] - 48);
tempRes = f + s + mem;
if(tempRes == 3) {
mem = 1;
tempRes = 1;
} else
if(tempRes == 2) {
mem = 1;
tempRes = 0;
} else
mem = 0;
result = tempRes + result;
}
//для видалення лишнььої 1 з старшого розряду
if(mem == 1) {
result = Addition(result, "00000000000000000000000000000001");
}
return result;
}
private static string Add32Symbols(string Value) {// заповнює в числі всі 32 розряди
int AddValue = 0;
if(((int)Value[0] - 48) == 1)
AddValue = 1;
while(Value.Length != 32)
Value = AddValue + Value;
return Value;
}
private static string Complementary(string Value) {//перетвор в зворотный код
string result = "";
if(((int)Value[0] - 48) == 1) //якшо число відємне , тобто 3-(-4) = 3+4
return Value;
result += Value[0];
for(int i = 1;i < 32;i++) {
if(((int)Value[i] - 48) == 1)
result += 1;
else
result += 0;
}
return result;
}
private static bool BadValue(string Value) {
if(Value.Length == 0 | Value.Length > 32)
return true;
for(int i = 0;i < Value.Length;i++) {
if(!((((int)Value[i] - 48) == 1) | (((int)Value[i] - 48) == 0)))
return true;
}
return false;
}
//converter
private static bool BadValue(string Value,int Capacity) {
if(Value.Length == 0 | Value.Length > 32)
return true;
for(int i = 0;i < Value.Length;i++) {
if(!( ((int)Value[i] >= 48) && ((int)Value[i] <=47+Capacity) ))
return false;
}
return true;
}
private static int ConvertTo10(string Value,int Capacity) {
int []OldValue = new int[Value.Length];
for(int i = 0;i<Value.Length;i++){
if((int)Value[i]<=57)
OldValue[i] = (int)Value[i]- 48;
else
OldValue[i] = (int)Value[i]- 55;
}
int result = 0;
int Index = Value.Length - 1;
for(int i = 0;i < Value.Length;i++) {
result +=(int)( OldValue[i] * Math.Pow(Capacity, Index));
Index--;
}
return result;
}
internal static string Convert(string value, int RealCapacity, int NewCapacity) {
if(!BadValue(value, RealCapacity))
return BadValueText;
int Decimal = ConvertTo10(value,RealCapacity);
string NewValue = ConvertToNewCapacity(Decimal,NewCapacity);
return NewValue;
}
private static string ConvertToNewCapacity(int Decimal, int NewCapacity) {
string result = "";
int Index = -1;
while(Decimal > 0) {
Index++;
if (Decimal >= NewCapacity)
result = Decimal % NewCapacity + result;
else
result = Decimal + result;
Decimal = Decimal / NewCapacity;
}
if(Index == -1)
result = "0";
return result;
}
const string BadValueText = "Неправильні аргументи.";
}
}
Робота програми
Висновок
В даній домашній роботі я закріпив свої навички щодо переводу чисел з однієї системи числення в іншу, також я закріпив свої навички щодо представлення операції „-” операцією „+” в прямому коді.
Перелік використаної літератури
Каган Б.М. Электронные вычислительные машины и системы, М.: Энергоатомиздат, 1985.
Самофалов К.Г., Романкевич А.М., Валуйский В.Н., Каневский Ю.С., Пиневич М.М. Прикладная теория цифровых автоматов. — К.: Вища школа, 1987. — 375 с.
Фомин С.В. Системы счисления, М.: Наука, 1987.