Kravason1

Untitled

Nov 21st, 2025
853
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. //desetichno -> dvoichno
  6.  
  7. vector<bool> DtoB(int val) {
  8.     vector<bool> binary;
  9.     bool negative = val < 0;
  10.  
  11.     while (val != 0) {
  12.         binary.push_back(val % 2);
  13.         val /= 2;
  14.     }
  15.     binary.push_back(negative);
  16.  
  17.     return binary;
  18. }
  19.  
  20. //dvoichno -> desetichno
  21.  
  22. int BtoD() {
  23.     //lol nishto
  24.     return 0;
  25. }
  26.  
  27. class Register {
  28.     int n; //razrqd
  29.     vector<bool> reg; //stoinost
  30.     bool V; //prepulvane
  31.  
  32. public:
  33.     //Constructors
  34.  
  35.     Register(int nBits) {
  36.         this->n = nBits;
  37.         this->reg.assign(this->n, 0);
  38.         this->V = 0;
  39.     }
  40.  
  41.     Register(int nBits, int val) {
  42.         this->n = nBits;
  43.         this->reg.assign(this->n, 0);
  44.         vector<bool> value = DtoB(val);
  45.  
  46.         if (n <= value.size()) {
  47.             for (int i = 0; i < n; i++) {
  48.                 reg[i] = value[i];
  49.             }
  50.         }
  51.         else {
  52.             for (int i = 0; i < value.size() - 1; i++) {
  53.                 reg[i] = value[i];
  54.             }
  55.             reg[n - 1] = value[value.size() - 1];
  56.         }
  57.  
  58.         this->V = 0;
  59.     }
  60.  
  61.     //Setters, getters
  62.  
  63.     bool getV() const{
  64.         return V;
  65.     }
  66.  
  67.     void setV(bool v) {
  68.         this->V = v;
  69.     }
  70.  
  71.     vector<bool> getReg() const {
  72.         return reg;
  73.     }
  74.  
  75.     void setReg(vector<bool> binary) {
  76.         if (n <= binary.size()) {
  77.             for (int i = 0; i < n; i++) {
  78.                 reg[i] = binary[i];
  79.             }
  80.         }
  81.         else {
  82.             for (int i = 0; i < binary.size(); i++) {
  83.                 reg[i] = binary[i];
  84.             }
  85.         }
  86.         this->V = 0;
  87.     }
  88.  
  89.     int getN() const {
  90.         return n;
  91.     }
  92.  
  93.     //output
  94.  
  95.     void print(char divider = ' ') const{
  96.         cout << reg[n - 1] << '|';
  97.         for (int i = n - 2; i >= 0; i--) {
  98.             cout << reg[i];
  99.         }
  100.         cout << divider;
  101.     }
  102.  
  103.     void print(int start, int end, char divider = ' ') const {
  104.         cout << reg[end] << '|';
  105.         for (int i = end - 1; i >= start; i--) {
  106.             cout << reg[i];
  107.         }
  108.         cout << divider;
  109.     }
  110.  
  111.     void printDouble(char divider = ' ') const {
  112.         int half = n / 2;
  113.         cout << reg[n - 1] << '|';
  114.         for (int i = n - 2; i >= half; i--) {
  115.             cout << reg[i];
  116.         }
  117.         cout << ' ';
  118.         for (int i = half - 1; i >= 0; i--) {
  119.             cout << reg[i];
  120.         }
  121.         cout << divider;
  122.     }
  123.  
  124.     //operatori
  125.  
  126.     std::vector<bool>::reference operator [] (unsigned int i){
  127.         return reg[i];
  128.     }
  129.    
  130.     bool operator [] (unsigned int i) const{
  131.         return reg[i];
  132.     }
  133.  
  134.     void operator << (int s) {
  135.         for (int i = n - 1; i >= s; i--) {
  136.             reg[i] = reg[i - s];
  137.         }
  138.         for (int i = 0; i < s; i++) {
  139.             reg[i] = 0;
  140.         }
  141.     }
  142.  
  143.     void operator >> (int s) {
  144.         for (int i = 0; i < n - s; i++) {
  145.             reg[i] = reg[i + s];
  146.         }
  147.         for (int i = n - 1; i >= n - s; i--) {
  148.             reg[i] = 0;
  149.         }
  150.     }
  151.  
  152.     Register operator + (const Register& b) const {
  153.         Register result(n);
  154.         bool carry = 0;
  155.  
  156.         for (int i = 0; i < this->n; i++) {
  157.             result[i] = (reg[i] != b[i]) != carry;
  158.             carry = (reg[i] && b[i]) || ((reg[i] || b[i]) && carry);
  159.         }
  160.  
  161.         //prepulvane
  162.         result.V = (reg[n - 1] && b[n - 1] && !result[n - 1])
  163.                     || (!reg[n - 1] && !b[n - 1] && result[n - 1]);
  164.  
  165.         return result;
  166.     }
  167.  
  168.     void operator ++ () {
  169.         int i;
  170.         for (i = 0; i < n; i++) {
  171.             if (reg[i] == 0) {
  172.                 reg[i] = 1;
  173.                 break;
  174.             }
  175.             else {
  176.                 reg[i] = 0;
  177.             }
  178.         }
  179.         if (i == n - 1 && reg[i] == 1) {
  180.             this->V = 1; // prepulvane
  181.         }
  182.     }
  183.  
  184.     //funkcii za preobrazuvane
  185.  
  186.     void convertDK() {
  187.         for (int i = 0; i < n - 1; i++) {
  188.             reg[i] = !reg[i];
  189.         }
  190.         ++*(this);
  191.     }
  192.  
  193.     void negate() {
  194.         reg[n - 1] = !reg[n - 1];
  195.         for (int i = 0; i < n - 1; i++) {
  196.             reg[i] = !reg[i];
  197.         }
  198.         ++ *(this);
  199.     }
  200. };
  201.  
  202. void multiply(Register& x, Register& y) {
  203.    
  204.     int n = y.getN();
  205.     int last = n * 2 - 1;
  206.     Register Mn(n * 2);
  207.     Register sum(n * 2);
  208.  
  209.     Mn.setReg(x.getReg());
  210.     Mn << n;
  211.     sum.setReg(y.getReg());
  212.  
  213.     //output
  214.     cout << "Mn:   "; Mn.print(n, last, '\n');
  215.     cout << "Z:    "; sum.printDouble(); cout << "Mt" << endl;
  216.  
  217.     int i;
  218.     for (int i = 1; i < n; i++) {
  219.  
  220.         if (sum[0] == 1) {
  221.             sum = sum + Mn;
  222.  
  223.             //output
  224.             cout << "     + |" << endl;
  225.             cout << "Mn:   "; Mn.print(n, last, '\n');
  226.             cout << "------------------------" << endl;
  227.             cout << "Z:    ";  sum.printDouble('\n');
  228.         }
  229.  
  230.  
  231.         bool V = sum.getV();
  232.         bool c = sum[last];
  233.         bool sign = (c && !V) || (!c && V);
  234.         sum >> 1;
  235.         sum[last] = sign;
  236.         sum.setV(0);
  237.  
  238.         //output
  239.         cout << "-->   "; sum.printDouble();
  240.         cout << ' ' << i << ") S = (" << c << " * " << !V << ") + (" << !c << " * " << V << ") = " << sign;
  241.         cout << endl;
  242.     }
  243.  
  244.     if (sum[0] == 1) {
  245.        
  246.         Mn.negate();
  247.         sum = sum + Mn;
  248.  
  249.         //output
  250.         cout << "     + |" << endl;
  251.         cout << "-Mn:  "; Mn.print(n, last, '\n');
  252.         cout << "------------------------" << endl;
  253.         cout << "Z:    ";  sum.printDouble('\n');
  254.     }
  255.     bool V = sum.getV();
  256.     bool c = sum[last];
  257.     bool sign = (c && !V) || (!c && V);
  258.     sum >> 1;
  259.     sum[last] = sign;
  260.     sum.setV(0);
  261.  
  262.     //output
  263.     cout << "-->   "; sum.printDouble();
  264.     cout << ' ' << n << ") S = (" << c << " * " << !V << ") + (" << !c << " * " << V << ") = " << sign;
  265.     cout << endl << endl;
  266.     cout << "Z = "; sum.printDouble('\n');
  267.  
  268. }
  269.  
  270. int main() {
  271.     Register regA(8, 56);
  272.     Register regB(8, -27);
  273.     regB.convertDK();
  274.     Register regC(8);
  275.     Register regD(8, -128);
  276.     regD.convertDK();
  277.     Register regE(8, -1);
  278.     regB.convertDK();
  279.  
  280.     multiply(regA, regB);
  281.  
  282.  
  283.     //++regC;
  284.     //regC.print();
  285.     //++regC;
  286.     //regC.print();
  287.     //++regC;
  288.     //regC.print();
  289.  
  290.     //regD.print();
  291.     //regD.convertDK();
  292.     //regD.print();
  293.     //++regD;
  294.     //regD.print();
  295.  
  296.     //regE.print();
  297.     //regE.convertDK();
  298.     //regE.print();
  299.     //++regE;
  300.     //regE.print();
  301. }
Advertisement
Add Comment
Please, Sign In to add comment