по сути это и есть два массива типа char[], только вместо 0 и 1 соответсвенно 30 и 31. Даже наверное конструкция типа
Код:
result = (result << 1) | (0x1 & (str[pos] - '0'));
смотрелась бы лучше в from_binary()
Вот ещё прикольная интерпретация: модель микросхемы.
Код:
#include <iostream>
using namespace std;
// в чипе стоит цифровой вольтметр :) на основе простейшего ADC
char __amp_boost [4] = {0, 1, 1, 1}; // у транзистора ниже напряжения отпирания.
char __amp_fade [4] = {0, 0, 1, 1}; // у транзистора выше напряжения отпирания.
char __amp_wave [4] = {0, 1, 0, 1}; // фиг знает что, наверное нет такого
char __amp_neg [4] = {1, 0, 0, 0}; // фиг знает что, наверное нет такого
char __amp_off [4] = {0, 0, 0, 0}; // разрыв цепи
struct micro_op
{
char op;
char hotch_c; // перенос вкл/выкл
char hotch_bit1; // операнд 1 вкл/выкл
char hotch_bit2; // операнд 2 вкл/выкл
char* amp_r; // усилитель для результата
char* amp_c; // усилитель для переноса
};
micro_op micro_ops[5] = {
{'+', 1, 1, 1, __amp_wave, __amp_fade},
{'&', 0, 1, 1, __amp_fade, __amp_off},
{'|', 0, 1, 1, __amp_boost,__amp_off},
{'^', 0, 1, 1, __amp_wave, __amp_off},
{'~', 0, 1, 0, __amp_neg, __amp_off}};
struct macro_CPU
{
char _f[12]; // флаги
char _a[12]; // аккумулятор
char _b[12]; // регистр 1
char _c[12]; // регистр 2
static void output(const char* name, const char* register1);
void output();
void operate(char op);
};
void macro_CPU::output(const char* name, const char* register1)
{
cout << name << " : ";
for(unsigned n=0; n<12; ++n) cout << register1[n];
cout << "\n";
}
void macro_CPU::output()
{
cout << "CPU state:\n";
output("F", _f);
output("A", _a);
output("B", _b);
output("C", _c);
}
void macro_CPU::operate(char op)
{
micro_op* op_scheme;
for ( op_scheme=micro_ops; op_scheme<micro_ops+5 && op_scheme->op!=op; ++op_scheme) {}
if ( op_scheme < micro_ops+5)
{
// установка переноса полезна для многобайтовых операций
bool c = (_f[11]=='1'); // перенос
for (unsigned bit_n=12; --bit_n<12; )
{
// напряжение поступает на контакты схемы
bool bit1 = (_b[bit_n]=='1');
bool bit2 = (_c[bit_n]=='1');
// получаем напряжение на смесителе
int voltage = (c & op_scheme->hotch_c) +
(bit1 & op_scheme->hotch_bit1) +
(bit2 & op_scheme->hotch_bit2);
// прогоняем через фильтр
bool result = op_scheme->amp_r[voltage];
c = op_scheme->amp_c[voltage];
// снимаем со схемы
_a[bit_n] = '0' + result;
}
_f[11] = '0' + c; // для многобайтоывых операций
}
}
void main()
{
macro_CPU cpu = {
"000000000000", // F
"000000000000", // A
"000011010001", // B
"000010101001"}; // C
cpu.output();
cpu.operate('+'); // A = B op C
cpu.output();
}
|